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 }
越努力,越幸运