Description
省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。经过调查评估,得到的统计表中列出了有可能建设公路的若干条道路的成本。现请你编写程序,计算出全省畅通需要的最低成本。
Input
测试输入包含若干测试用例。每个测试用例的第1行给出评估的道路条数 N、村庄数目M ( < 100 );随后的 N 行对应村庄间道路的成本,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间道路的成本(也是正整数)。为简单起见,村庄从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<stdio.h>
2 #include<stdlib.h>
3 #include<algorithm>
4
5 using namespace std;
6 struct node
7 {
8 int i, j, val;
9 }T[5000];
10 int n, m;
11 int set[333];
12 void make_set()
13 {
14 for( int i = 0; i < 111; i++ )
15 set[i] = i;
16 }
17 bool cmp( node A, node B )
18 {
19 return A.val < B.val;
20 }
21 int find( int x )
22 {
23 return set[x] == x? x: set[x] = find( set[x] );
24 }
25 int merge( int x, int y )
26 {
27 int x1 = find(x), y1=find(y);
28 if( x1 == y1 )
29 return 1;
30 else
31 {
32 set[x1] = y1;
33 return 0;
34 }
35 }
36 bool flags[200];
37 int main()
38 {
39
40 while( scanf( "%d%d", &n, &m ), n )
41 {
42 make_set();
43 int count, i, result = 0;
44 memset(flags,0,sizeof(flags));
45 for( i = 1; i <= n; i++ )
46 {
47 scanf( "%d%d%d", &T[i].i, &T[i].j, &T[i].val );
48 }
49 sort( T+1, T+n+1, cmp );
50 for(int i=1; i <= n; i++)
51 {
52
53 if(merge(T[i].i,T[i].j)==0)
54 {
55 result += T[i].val;
56 }
57 }
58 for(int i=1; i<=m; i++ )
59 {
60 flags[find(i)] = 1;
61 }
62 int k=0;
63 for(int i=1;i<=m;i++)
64 {
65 if( flags[i] == 1 )
66 k++;
67 }
68 if( k != 1 )
69 printf("?\n");
70 else
71 printf("%d\n", result );
72 }
73 }