http://acm.hdu.edu.cn/showproblem.php?pid=1162
最简单的最小生成树。。。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <stdio.h> #include <stdlib.h> #include <math.h> int p[110]; int cnt,n; typedef struct L { int a,b; double d; }L; L r[10000]; double dis(double x1,double y1,double x2,double y2){return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));} int cmp(const void*a,const void*b) { struct L*c=(struct L*)a; struct L*dd=(struct L*)b; return c->d-dd->d>0?1:-1; } int find(int x){return p[x]==x?x:p[x]=find(p[x]);} double Kruskal() { double ans=0; int x,y,i; for(i=0;i<n;i++)p[i]=i; qsort(r,cnt,sizeof(L),cmp); for(i=0;i<cnt;i++) { x=find(r[i].a); y=find(r[i].b); if(x!=y){ans+=r[i].d;p[x]=y;} } return ans; } int main() { int i,j; double x[110],y[110]; while(~scanf("%d",&n)) { cnt=0; for(i=0;i<n;i++) scanf("%lf%lf",&x[i],&y[i]); for(i=0;i<n;i++) for(j=i+1;j<n;j++) { r[cnt].a=i; r[cnt].b=j; r[cnt++].d=dis(x[i],y[i],x[j],y[j]); } printf("%.2lf\n",Kruskal()); } return 0; }