hdu1875
#include<stdlib.h> #include<string.h> #include<stdio.h> #include<math.h> #define MAXN 105 #define inf 1000000000 typedef double elem; elem prim(int n,elem mat[][MAXN]){ elem min[MAXN],ret=0; int v[MAXN],i,j,k; for (i=0;i<n;i++) min[i]=inf,v[i]=0; for (min[j=0]=0;j<n;j++){ for (k=-1,i=0;i<n;i++) if (!v[i]&&(k==-1||min[i]<min[k])) k=i; if(ret == inf) return -1; for (v[k]=1,ret+=min[k],i=0;i<n;i++) if (!v[i]&&mat[k][i]<min[i]) min[i]=mat[k][i]; } return ret; } int main(){ int i; int j; int n; int m; int island[105][3]; elem distance[105][105]; // freopen("in_prim.txt","r",stdin); // freopen("out.txt","w",stdout); scanf("%d",&n); while(n--){ scanf("%d",&m); for(i=0;i<m;i++){ scanf("%d %d",&island[i][0],&island[i][1]); } for(i=0;i<m;i++){ for(j=i;j<m;j++){ if(i==j){ distance[i][j] = inf; }else{ elem disbuf = sqrt((elem)(island[j][0]-island[i][0])*(island[j][0]-island[i][0]) +(island[j][1]-island[i][1])*(island[j][1]-island[i][1]));//注意进行数据类型强转,否则会出现编译错误 if(disbuf < 10 || disbuf > 1000){ distance[i][j] = inf; distance[j][i] = inf; }else{ distance[i][j] = disbuf; distance[j][i] = disbuf; } } } } double bufref = prim(m,distance); if(bufref != -1) printf("%.1lf\n",bufref*100); else printf("oh!\n"); } return 0; }