poj3625temp

来源:互联网 发布:mysql order by 原理 编辑:程序博客网 时间:2024/04/30 16:22
#include"stdio.h"#include"math.h"#include"string.h"#include"stdlib.h"int n,m;struct B{__int64 x,y;}E[1011];                                      //记录点struct A{int a,b;__int64 len;                               //这个是两点距离的平方}eage[500000];                                 //记录边int Num;int set[1011];                                 //点的pre,并查集用的int cmp(const void *a,const void *b){struct A *c,*d;c=(struct A *)a;d=(struct A *)b;if(c->len>d->len)return 1;return -1;}void build(int num)                   //建立{int i;for(i=1;i<=num;i++)set[i]=i;}int find(int k)                       //查找{if(set[k]==k)return k;set[k]=find(set[k]);return set[k];}void Union(int f1,int f2)             //合并{set[f1]=f2;}double Kruskal(){int i;int f1,f2;double ans=0;for(i=0;i<Num;i++){f1=find(eage[i].a);f2=find(eage[i].b);if(f1==f2)continue;Union(f1,f2);ans+=sqrt(1.0*eage[i].len);          //ans加东西,这个时候才把距离开根号}return ans;}int main(){int i,l;int a,b;int f1,f2;while(scanf("%d%d",&n,&m)!=-1){///读入点for(i=1;i<=n;i++)scanf("%I64d%I64d",&E[i].x,&E[i].y);///建立build(n);///计算边Num=0;for(i=2;i<=n;i++){for(l=1;l<i;l++){eage[Num].a=i;eage[Num].b=l;eage[Num++].len=(E[i].x-E[l].x)*(E[i].x-E[l].x)+(E[i].y-E[l].y)*(E[i].y-E[l].y);}}///已经连接过的直接并入同一集合while(m--){scanf("%d%d",&a,&b);f1=find(a);f2=find(b);if(f1==f2)continue;Union(f1,f2);}///结果qsort(eage,Num,sizeof(eage[0]),cmp);printf("%0.2lf\n",Kruskal());}return 0;}