您的位置:首页 > 编程语言 > C语言/C++

POJ 1751

2015-07-15 20:22 429 查看
#include<stdio.h>
#include<algorithm>
using namespace std;
const int  M=5000000+10;
const int  N=10000+10;
int f
;
int x
,y
;
int n,cnt;
struct p
{
int u,v,w;
}num[M];

bool cmp(p x,p y)
{
return x.w<y.w;
}
int find(int x)
{
if(x!=f[x])
f[x]=find(f[x]);
return f[x];
}
int juli(int i,int j)
{
return (x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]);
}
void kruskal()
{
int i,tot=0;
for(i=0;i<cnt&&tot<n-1;i++)
{
int a=find(num[i].u);
int b=find(num[i].v);
if(a==b)
continue;

printf("%d %d\n",num[i].u,num[i].v);
f[a]=b;
tot--;
}
}
int main()
{
int i,j,k,a,b;
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d %d",&x[i],&y[i]);
scanf("%d",&k);
for(i=0;i<=n;i++)
f[i]=i;
for(i=0;i<k;i++)
{
scanf("%d%d",&a,&b);
a=find(a);
b=find(b);
if(a!=b)
f[a]=b;
}
cnt=0;
for(i=1;i<=n;i++)
{
for(j=i+1;j<=n;j++)
{
int a,b;
a=find(i);
b=find(j);
if(a==b)
continue;
num[cnt].u=i;
num[cnt].v=j;
num[cnt++].w=juli(i,j);
}
}
sort(num,num+cnt,cmp);
kruskal();

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息