hdu-1875 畅通工程再续---MST

题目链接:

https://vjudge.net/problem/HDU-1875

题目大意:

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

解题思路:

hdu-1863类似,也是MST加连通

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int maxn = 100 + 10;
 5 const int INF = 1e9 + 7;
 6 double Map[maxn][maxn];
 7 double lowcost[maxn];
 8 int mst[maxn];
 9 int n, m;
10 double prim(int u)
11 {
12     double ans = 0;
13     for(int i = 1; i <= n; i++)
14     {
15         lowcost[i] = Map[u][i];
16         mst[i] = u;
17     }
18     mst[u] = -1;
19     for(int i = 1; i < n; i++)
20     {
21         double minn = INF - 1;
22         int v = -1;
23         //寻找lowcost数组里面的未加入mst的最小值
24         for(int j = 1; j <= n; j++)
25         {
26             if(mst[j] != -1 && lowcost[j] < minn)
27             {
28                 v = j;
29                 minn = lowcost[j];
30             }
31         }
32         if(v != -1)
33         {
34             mst[v] = -1;
35             ans += lowcost[v];
36             for(int j = 1; j <= n; j++)
37             {
38                 if(mst[j] != -1 && lowcost[j] > Map[v][j])
39                 {
40                     lowcost[j] = Map[v][j];
41                     mst[j] = v;
42                 }
43             }
44         }
45         else return -1.0;//没有找到,说明不连通
46     }
47     return ans;
48 }
49 struct node
50 {
51     int x, y;
52 }a[maxn];
53 double dis(node a, node b)
54 {
55     return sqrt(1.0 * (a.x - b.x) * (a.x - b.x) + 1.0 * (a.y - b.y) * (a.y - b.y));
56 }
57 int main()
58 {
59     int T;
60     scanf("%d", &T);
61     while(T--)
62     {
63         scanf("%d", &n);
64         for(int i = 1; i <= n; i++)
65             for(int j = 1; j <= n; j++)Map[i][j] = INF * 1.0;
66         memset(lowcost, 0, sizeof(lowcost));
67         for(int i = 1; i <= n; i++)
68         {
69             scanf("%d%d", &a[i].x, &a[i].y);
70         }
71         for(int i = 1; i <= n; i++)
72         {
73             for(int j = i + 1; j <= n; j++)
74             {
75                 double d = dis(a[i], a[j]);
76                 if(d < 10 || d > 1000)continue;
77                 Map[i][j] = Map[j][i] = d;
78             }
79         }
80         double ans = prim(1);
81         if(ans > 0)printf("%.1f\n", ans * 100);
82         else printf("oh!\n");
83     }
84     return 0;
85 }

 

posted @ 2018-04-21 11:36  _努力努力再努力x  阅读(92)  评论(0编辑  收藏  举报