您的位置:首页 > 其它

poj2349 Kruskal题解

2017-08-13 10:47 232 查看
Kruskal:Arctic Network
题目大概意思就是给你n个点的坐标,有几个点不用花钱,求最小生成树(不用花钱的)费用.

#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<math.h>
using namespace std;
int x[1001],y[1001],dep;
struct Dis
{
int val,from,to;
};
Dis dis[2000001];
int father[1001],s[1001];
int find(int x)
{
if(father[x]!=x)
return find(father[x]);
return x;
}
void update(int a,int b)
{
dep--;
int fa=find(a);
int fb=find(b);
if(s[fa]>s[fb])
father[fb]=fa,s[fa]+=s[fb];
else
father[fa]=fb,s[fb]+=s[fa];
}
bool cmp(const Dis &a,const Dis &b)
{
return a.val<b.val;
}
int main()
{
int n,k,i,j,q,l;
scanf("%d",&q);
for(l=1;l<=q;l++)
{
int idx=0;
scanf("%d%d",&k,&n);
dep=n;
for(i=1;i<=n;i++)
s[i]=1,father[i]=i;
for(i=1;i<=n;i++)
scanf("%d%d",&x[i],&y[i]);
for(i=1;i<=n;i++)
for(j=1;j<i;j++)
{
dis[++idx].val=(x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]);
dis[idx].from=i;
dis[idx
c464
].to=j;
}
sort(dis+1,dis+idx+1,cmp);
for(i=1;i<=idx;i++)
{
if(find(dis[i].from)==find(dis[i].to))
continue;
update(dis[i].from,dis[i].to);
if(dep==k)
{
printf("%.2lf\n",sqrt(double(dis[i].val)));
break;
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息