Codeforces Round 597 (Div. 2) D (最小生成树)

题目链接:Codeforces Round 597 (Div. 2) D 

// Problem: D. Shichikuji and Power Grid
// Contest: Codeforces - Codeforces Round 597 (Div. 2)
// URL: https://codeforces.com/contest/1245/problem/D
// Memory Limit: 256 MB
// Time Limit: 2000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include
using namespace std;

typedef long long ll;
typedef pair pii;

const int N=2e5+5;
const int M=N*2;
const int P=1e6;

struct edge{   
	int sx,sy,ex,ey;
	ll w;
};

vector p;
vector v;

int find(int x){    //并查集
	if(p[x]!=x){
		p[x]=find(p[x]);
	}
	return p[x];
}

void add(int sx,int sy,int ex,int ey,ll w){   //建树,分别是两个点的坐标和边值
	v.push_back({sx,sy,ex,ey,w});
}

bool cmp(edge a,edge b){   //按边值排序
	return a.w>n;
	
	vector x(n+1),y(n+1);   //坐标
	map mp;   //离散化
	mp[0]=0;
	map s;   //离散化
	
	int tot=1;
	for(int i=1;i<=n;i++){
		cin>>x[i]>>y[i];   //输入坐标
		mp[1ll*x[i]*P+y[i]]=tot;   //给点编号
		tot++;
		s[{x[i],y[i]}]=i;   //这个坐标是第几个城市
	}
	
	p.assign(tot+1,0);
	for(int i=1;i<=tot;i++){
		p[i]=i;
	}
	
	vector c(n+1),k(n+1);
	
	for(int i=1;i<=n;i++){    //输入建立发电站需要的成本以及建树
		cin>>c[i];
		add(0,0,x[i],y[i],c[i]);
	}
	for(int i=1;i<=n;i++){   //输入拉线需要的成本
		cin>>k[i];
	}
	
	for(int i=1;i<=n;i++){
		for(int j=i+1;j<=n;j++){   //遍历两个点
			int sx=x[i],sy=y[i];   //坐标
			int ex=x[j],ey=y[j];
			int d=abs(sx-ex)+abs(sy-ey);  //两个城市的距离 
			ll w=1ll*d*(k[i]+k[j]);   //每两个城市拉线的成本
			add(sx,sy,ex,ey,w);   //建树
		}
	}
	
	sort(v.begin(),v.end(),cmp);   //树里面排序
	ll ans=0;
	vector path;   //需要链接哪两个城市
	vector city;    //在哪个城市建发电站
	for(int i=0;i

你可能感兴趣的:(算法)