POJ 1751 最小生成树

题意:给一个坐标图,求最小生成树。

题解:题目比较裸。注意节点的序号

#include <iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;

int px[755],py[755];
int n,m,tot;
struct node{
	int u,v,w;
}e[500000];
int p[755];
queue<node>que;
int finde(int x){
	if(p[x]==x)return x;
	return p[x]=finde(p[x]);
}
void unit(int x,int y){
	x=finde(x);
	y=finde(y);
	if(x==y)return ;
	p[x]=y;
}
bool check(int x,int y){
	x=finde(x);
	y=finde(y);
	if(x==y)return true;
	return false;
}
void init(){
	int i;
	for(i=0;i<=n;i++)p[i]=i;
	while(!que.empty())que.pop();
	tot=0;
}
int cmp(node a,node b){
	return a.w<b.w;
}
void kriskal(){
	int i;
	bool flag;
	node edge;
	sort(e,e+tot,cmp);
	for(i=0;i<tot;i++){
		edge=e[i];
		flag=check(edge.u,edge.v);
		if(flag)continue;
		unit(edge.u,edge.v);
		if(edge.w!=0)printf("%d %d\n",edge.u+1,edge.v+1);
	}
	return ;
}
int main()
{
	int i,j;
	scanf("%d",&n);
		init();
		for(i=0;i<n;i++)scanf("%d%d",&px[i],&py[i]);
		for(i=0;i<n;i++)
			for(j=0;j<i;j++){
				//if(i==j)continue;
		                e[tot].u=i;
		                e[tot].v=j;
		                e[tot].w=(px[i]-px[j])*(px[i]-px[j])+(py[i]-py[j])*(py[i]-py[j]);
				tot++;
			}
		scanf("%d",&m);
		while(m--){
			scanf("%d%d",&i,&j);
			i--,j--;
			unit(i,j);
		}
		kriskal();

  //  cout << "Hello world!" << endl;
    return 0;
}

吐槽一下……用!=EOF读入会超时。

猜你喜欢

转载自blog.csdn.net/nwpu2017300135/article/details/81069397
今日推荐