畅通工程再续--hdu1875

畅通工程再续

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 19462    Accepted Submission(s): 6095


Problem Description
相信大家都听说一个“百岛湖”的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现。现在政府决定大力发展百岛湖,发展首先要解决的问题当然是交通问题,政府决定实现百岛湖的全畅通!经过考察小组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!
 

这道题挺不错的,没有直接给你要结合的点,你要自己去寻找!

我们发现,只有当这个岛屿和其他的距离在10到1000这个范围内才能结合,我们就可以让这一个岛屿和其他的全部尝试一下,符合的就先放在结构体中!

然后就可以用最小生成树来解决了!

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<cmath>
 5 using namespace std;
 6 int per[110],cot;
 7 struct node
 8 {
 9     int b,e;
10     double w;
11 }s[10000];//注意结构体要开大点,不然会re
12 bool cmp(node x,node y)
13 {
14     return x.w<y.w;
15 }
16 void init()
17 {
18     int i;
19     for(i=0;i<110;i++)
20     per[i]=i;
21 }
22 int find(int x)
23 {
24     while(x!=per[x])
25     x=per[x];
26     return x;
27 }
28 bool join(int x,int y)
29 {
30     int fx=find(x);
31     int fy=find(y);
32     if(fx!=fy)
33     {
34         per[fx]=fy;
35         cot++;//记录连接的边数
36         return true;
37     }
38     return false;
39 }
40 int main()
41 {
42     int i,j,n,n1;
43     double x[1010],y[1010];
44     scanf("%d",&n);
45     while(n--)
46     {
47         init();
48         scanf("%d",&n1);
49         for(i=0;i<n1;i++)
50         {
51             scanf("%lf%lf",&x[i],&y[i]);        
52         }
53         int k=0;
54         for(i=0;i<n1;i++)
55         {
56             for(j=i;j<n1;j++)
57             {
58                 double q=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));//q来记录两岛屿的距离
59                 if(q>=10&&q<=1000)
60                 {
61                     s[k].b=i;
62                     s[k].e=j;
63                     s[k].w=q;
64                     k++;
65                 }//符合要求的放在结构体中
66 
67             }
68         }
69         cot=0;
70         sort(s,s+k,cmp);
71         double sum=0;
72         for(i=0;i<k;i++)
73         {
74             if(join(s[i].b,s[i].e))
75             sum+=s[i].w;
76         }
77         if(cot!=n1-1)//如果边数不等于点数-1就不能全部连通
78         printf("oh!
");
79         else
80         printf("%.1lf
",sum*100);
81         
82     }
83     return 0;
84 }
原文地址:https://www.cnblogs.com/Eric-keke/p/4721077.html