http://acm.hdu.edu.cn/showproblem.php?pid=1875
1 #include <cstdio> 2 #include <cstring> 3 #include <cmath> 4 #include <algorithm> 5 #define maxn 1001 6 using namespace std; 7 const int inf=1<<30; 8 9 int n; 10 double g[maxn][maxn]; 11 bool vis[maxn]; 12 double dis[maxn]; 13 double sum; 14 bool flag=true; 15 16 struct node 17 { 18 int x,y; 19 }p[maxn]; 20 21 22 int sqr(int x) 23 { 24 return x*x; 25 } 26 27 double dist(int x1,int y1,int x2,int y2) 28 { 29 return sqrt(sqr(x1-x2)+sqr(y1-y2)); 30 } 31 32 void prim() 33 { 34 memset(vis,false,sizeof(vis)); 35 for(int i=0; i<n; i++) dis[i]=g[0][i]; 36 dis[0]=0; 37 vis[0]=true; 38 for(int i=1; i<n; i++) 39 { 40 double m=(double)inf; 41 int x; 42 for(int y=0; y<n; y++) if(!vis[y]&&dis[y]<m) m=dis[x=y]; 43 if(m==inf){flag=false;break;} 44 sum+=m; 45 vis[x]=true; 46 for(int y=0; y<n; y++) if(!vis[y]&&dis[y]>g[x][y]) dis[y]=g[x][y]; 47 48 } 49 } 50 int main() 51 { 52 int t; 53 scanf("%d",&t); 54 while(t--) 55 { 56 scanf("%d",&n); 57 for(int i=0; i<200; i++) 58 { 59 for(int j=0; j<200; j++) 60 { 61 if(i==j) g[i][j]=0; 62 else 63 g[i][j]=g[j][i]=inf; 64 } 65 } 66 for(int i=0; i<n; i++) 67 { 68 scanf("%d%d",&p[i].x,&p[i].y); 69 } 70 for(int i=0; i<n; i++) 71 { 72 for(int j=0; j<n; j++) 73 { 74 if(i!=j){ 75 double d=dist(p[i].x,p[i].y,p[j].x,p[j].y); 76 if(d>=10.0&&d<=1000.0) g[i][j]=d; 77 } 78 } 79 } 80 flag=true; 81 sum=0.0; 82 prim(); 83 if(!flag) printf("oh! "); 84 else 85 printf("%.1lf ",(sum*100)); 86 } 87 return 0; 88 }