标签:
并查集+最小生成树
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 7669 Accepted Submission(s):
3882
#include<stdio.h> #include<algorithm> #include<math.h> using namespace std; int set[110]; struct record//注意此题要用实型 { double a; double b; double ju;//两点之间距离 }s[10000]; int find(int fa) { int ch=fa; int t; while(fa!=set[fa]) fa=set[fa]; while(ch!=fa) { t=set[fa]; set[ch]=fa; ch=t; } return fa; } void mix(int x,int y) { int fx,fy; fx=find(x); fy=find(y); if(fx!=fy) set[fx]=fy; } double dis(double x1,double y1,double x2,double y2) { return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); //计算两点之间距离 } bool cmp(record c,record d) { return c.ju<d.ju; } int main() { int m,j,i,point; double sum; double a[110];//这两个数组用来储存点的坐标,a数组储存横标 double b[110];//b数组储存纵标 while(scanf("%d",&point)!=EOF) { for(i=0;i<=point;i++) set[i]=i; for(i=1;i<=point;i++) { scanf("%lf%lf",&a[i],&b[i]); } m=0; for(i=1;i<=point-1;i++) //此循环求任意两点之间距离 { //并记录下此两点位置 for(j=i+1;j<=point;j++) { s[m].ju=dis(a[i],b[i],a[j],b[j]); s[m].a=i; s[m].b=j; m++; } } sort(s,s+m,cmp); sum=0; for(i=0;i<m;i++) { if(find(s[i].a)!=find(s[i].b)) { mix(s[i].a,s[i].b); sum+=s[i].ju; } } printf("%.2lf\n",sum); } return 0; }
标签:
原文地址:http://www.cnblogs.com/tonghao/p/4470938.html