HDU--1875 畅通工程再续

相信大家都听说一个“百岛湖”的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现。现在政府决定大力发展百岛湖,发展首先要解决的问题当然是交通问题,政府决定实现百岛湖的全畅通!经过考察小组RPRush对百岛湖的情况充分了解后,决定在符合条件的小岛间建上桥,所谓符合条件,就是2个小岛之间的距离不能小于10米,也不能大于1000米。当然,为了节省资金,只要求实现任意2个小岛之间有路通即可。其中桥的价格为 100元/米。

Input

  输入包括多组数据。输入首先包括一个整数T(T <= 200),代表有T组数据。 
每组数据首先是一个整数C(C <= 100),代表小岛的个数,接下来是C组坐标,代表每个小岛的坐标,这些坐标都是 0 <= x, y <= 1000的整数。 
Output

  每组输入数据输出一行,代表建桥的最小花费,结果保留一位小数。如果无法实现工程以达到全部畅通,输出”oh!”.Sample Input

2
2
10 10
20 20
3
1 1
2 2
1000 1000

Sample Output

1414.2
oh!
代码:
思路正确,就是一编译就弹出一页程序,学长说stl调用有问题,我还未找到...代码先放着,慢慢找
 1 #include<cstdio>
 2 #include<math.h>
 3 #include<algorithm>
 4 using namespace std;
 5 int par[110];
 6 struct note
 7 {
 8     int st;
 9     int endd;
10     int quan;
11 }p[101];
12 struct xy
13 {
14     int x;
15     int y;
16 }q[101];
17 bool cmp(note x,note y)
18 {
19     return x.quan<y.quan;
20 }
21 double distance(xy a,xy b)
22 {
23     double sum;
24     sum=sqrt((double)(a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
25     return sum;    
26 }
27 int pan(double x)
28 {
29     if(x>=10&&x<=1000)
30         return 1;
31     else return 0;
32 }
33 
34 int find(int x)
35 {
36     if(x!=par[x])
37       return par[x]=find(par[x]);
38     return par[x];  
39 }
40 void unite(int a,int b)
41 {
42     int fa=find(a);
43     int fb=find(b);
44     if(fa!=fb)
45       {
46           par[fa]=fb;
47       }
48 }
49 int main()
50 {
51     int t,n;
52     scanf("%d",&t);
53     while(t--)
54     {
55         scanf("%d",&n);
56         for(int i=1;i<110;i++)
57           par[i]=i; 
58         for(int i=1;i<=n;i++)
59           scanf("%d %d",&q[i].x,&q[i].y);
60         int k=1;  
61         for(int i=1;i<=n;i++)
62           for(int j=i+1;j<=n;j++)
63             {
64                 double m=distance(q[i],q[j]);
65                 if(pan(m))
66                 {
67                     p[k].st=i;
68                     p[k].endd=j;
69                     p[k++].quan=distance(q[i],q[j]);
70                     
71                 }   
72                       
73             } 
74         sort(p+1,p+k,cmp);        
75         double money=0;        
76         for(int i=1;i<k;i++)
77         {
78             if(find(p[i].st)!=find(p[i].endd))
79             {
80                 unite(p[i].st,p[i].endd);
81                 money+=p[i].quan*100;
82             }    
83         } 
84         int flag=0;
85         for(int i=1;i<k;i++)
86           if(i==par[i])
87             flag++;
88         if(flag==1)
89            printf("%.1lf\n",money);
90          else printf("oh!\n");              
91                 
92           
93     }
94     return 0;
95 }

 

 
posted @ 2017-08-03 21:05  ⊙∽⊙Perseverance  阅读(164)  评论(0编辑  收藏  举报