hdu 畅通工程再续

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!\n");
84        else
85        printf("%.1lf\n",(sum*100));
86     }
87     return 0;
88 }
View Code

 

posted @ 2014-04-15 19:31  null1019  阅读(158)  评论(0编辑  收藏  举报