http://acm.hdu.edu.cn/showproblem.php?pid=1162
#include<stdio.h> #include<math.h> #include<string.h> #define INF 0x3f3f3f3f #define N 110 struct Node { double x,y; }node[N]; int vis[N],n; double map[N][N],dis[N]; void prim() { int i,j,k; double min,sum=0; memset(vis,0,sizeof(vis)); vis[0]=1; for(i=1;i<n;i++) dis[i]=map[0][i]; for(i=1;i<n;i++) { min=INF; for(j=0;j<n;j++) if(!vis[j]&&min>dis[j]) { min=dis[j]; k=j; } if(min==INF) break; sum+=min; vis[k]=1; for(j=0;j<n;j++) if(!vis[j]&&dis[j]>map[k][j]) dis[j]=map[k][j]; } printf("%.2lf\n",sum); } int main(void) { int i,j; while(scanf("%d",&n)!=EOF) { for(i=0;i<n;i++) scanf("%lf%lf",&node[i].x,&node[i].y); for(i=0;i<n;i++) for(j=0;j<n;j++) { if(i==j) map[i][j]=0; else map[i][j]=sqrt((node[i].x-node[j].x)*(node[i].x-node[j].x)+(node[i].y-node[j].y)*(node[i].y-node[j].y)); } prim(); } return 0; }