poj2349 Kruskal题解

来源:互联网 发布:网络监控光纤收发器 编辑:程序博客网 时间:2024/05/02 02:21
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];elsefather[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].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;}}}}