Problem Description
省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。经过调查评估,得到的统计表中列出了有可能建设公路的若干条道路的成本。现请你编写程序,计算出全省畅通需要的最低成本。
Input
测试输入包含若干测试用例。每个测试用例的第1行给出评估的道路条数 N、村庄数目M ( < 100 );随后的 N
行对应村庄间道路的成本,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间道路的成本(也是正整数)。为简单起见,村庄从1到M编号。当N为0时,全部输入结束,相应的结果不要输出。
行对应村庄间道路的成本,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间道路的成本(也是正整数)。为简单起见,村庄从1到M编号。当N为0时,全部输入结束,相应的结果不要输出。
Output
对每个测试用例,在1行里输出全省畅通需要的最低成本。若统计数据不足以保证畅通,则输出“?”。
Sample Input
3 3
1 2 1
1 3 2
2 3 4
1 3
2 3 2
0 100
Sample Output
3
?
思路:裸的最小生成树
View Code
1 #include<iostream> 2 #include<stdio.h> 3 #include<string.h> 4 #include<stdlib.h> 5 #include<math.h> 6 #include<algorithm> 7 #define LL long long 8 #define mod 1e9 + 7 9 const int M = 105; 10 11 using namespace std; 12 13 struct node{ 14 int x; 15 int y; 16 int value; 17 }a[M * M >> 1]; 18 19 int cun[M]; 20 21 22 bool cmp(node a, node b) 23 { 24 return a.value < b.value; 25 } 26 27 int find(int x) 28 { 29 return cun[x] == x ? x : cun[x] = find(cun[x]); 30 } 31 32 void shu(int x, int y) 33 { 34 int p = find(x); 35 int q = find(y); 36 if(p != q) 37 cun[p] = q; 38 } 39 40 int main() 41 { 42 int n, m; 43 while( cin >> n >> m ) 44 { 45 if(n == 0) 46 break; 47 for(int i = 1; i <= n; ++i) 48 cin >> a[i].x >> a[i].y >> a[i].value; 49 if(n < m - 1) 50 { 51 puts("?"); 52 continue; 53 } 54 for(int i = 0; i <= n; ++i) 55 cun[i] = i; 56 sort(a,a + n,cmp); 57 int ans = 0; 58 int cnt = 1; 59 for(int i = 1; i <= n; ++i) 60 { 61 if(find(a[i].x) != find(a[i].y)) 62 { 63 cnt++; 64 shu(a[i].x,a[i].y); 65 ans += a[i].value; 66 } 67 } 68 if(cnt == m) 69 cout << ans << endl; 70 else 71 puts("?"); 72 } 73 return 0; 74 }
浙公网安备 33010602011771号