#include<stdio.h>
#include<algorithm>
using namespace std;
const int M=5000000+10;
const int N=10000+10;
int f[N];
int x[N],y[N];
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;
}
POJ 1751
最新推荐文章于 2018-08-16 10:01:58 发布