http://acm.hdu.edu.cn/showproblem.php?pid=1875
#include<stdio.h> #include<math.h> #define INF 9999999 #define N 110 double map[N][N]; void prim(int n) { int i,j,k,flag,vis[N]; double low[N],sum,min; for(i=0;i<n;i++) { vis[i]=0; low[i]=map[0][i]; } vis[0]=1; sum=0; flag=1; for(i=1;i<n;i++) { min=INF; for(j=1;j<n;j++) if(!vis[j]&&min>low[j]) { k=j; min=low[j]; } if(min==INF) { flag=0; break; } vis[k]=1; sum+=min; for(j=1;j<n;j++) if(!vis[j]&&low[j]>map[k][j]) low[j]=map[k][j]; } if(flag) printf("%.1f\n",100*sum); else printf("oh!\n"); } int main(void) { int i,j,T,n,x[N],y[N]; double dis; scanf("%d",&T); while(T--) { scanf("%d",&n); for(i=0;i<n;i++) scanf("%d%d",&x[i],&y[i]); for(i=0;i<n;i++) for(j=0;j<=i;j++) { dis=sqrt(((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]))*1.0); if(dis<10||dis>1000) map[j][i]=map[i][j]=INF; else map[i][j]=map[j][i]=dis; } prim(n); } return 0; }