Description
某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。
Input
测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( < 100 );随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见,村庄从1到N编号。
当N为0时,输入结束,该用例不被处理。
当N为0时,输入结束,该用例不被处理。
Output
对每个测试用例,在1行里输出最小的公路总长度。
Sample Input
3
1 2 1
1 3 2
2 3 4
4
1 2 1
1 3 4
1 4 1
2 3 3
2 4 2
3 4 5
0
Sample Output
3
5
Hint
Hint Huge input, scanf is recommended.
1 #include<stdio.h> 2 #include<iostream> 3 #include<string.h> 4 #define maxn 0x3fff 5 using namespace std; 6 int d[110] , map[110][110] , v[110] ;//d[i]用来存放(i - 1) - th ~ i - th (point) 的权值 , v[i] 中0表示没选过 , 1表示选过 7 int n , m ; 8 9 int prim (int start ) 10 { 11 int mm , x ; 12 for (int i = 1 ; i <= n ; i++) 13 d[i] = i == start ? 0 : maxn ; //给 起始点 和 非起始点 涂色 14 for (int i = 1 ; i <= n ; i++) { 15 mm = maxn ; 16 for (int j = 1 ; j <= n ; j++) { //找出权值最小的边 17 if ( !v[j] && d[j] < mm ) { 18 mm = d[j] ; 19 x = j ; 20 } 21 } 22 v[x] = 1 ; 23 for (int j = 1 ; j <= n ; j++ ) { 24 if ( !v[j] && d[j] > map[x][j] && map[x][j] != maxn ) 25 d[j] = map[x][j] ; 26 } 27 } 28 int tmp = 0 ; 29 for (int i = 1 ; i <= n ; i++) 30 tmp += d[i] ; 31 return tmp ; 32 } 33 34 int main () 35 { 36 // freopen ("a.txt" , "r" , stdin ) ; 37 int val ; 38 int a , b ; 39 int res ; 40 while ( cin >> n , n) { 41 m = n * (n - 1) >> 1 ; 42 memset (map , 0x3f , sizeof(map) ) ; 43 memset (v , 0 , sizeof(v) ) ; 44 for(int i = 1 ; i <= m ; i++ ) 45 { 46 scanf ("%d%d%d", &a , &b , &val ); 47 if( val < map[a][b] ) 48 { 49 map[a][b] = val; 50 map[b][a] = val; 51 } 52 } 53 res = prim(1) ; 54 cout << res << endl ; 55 } 56 return 0 ; 57 }
1 #include<stdio.h> 2 #include<algorithm> 3 using namespace std; 4 int fa[110] , n , m ; 5 struct edge 6 { 7 int u , v , w ; 8 }e[20000]; 9 10 int cmp (edge a , edge b) 11 { 12 return a.w < b.w ; 13 } 14 15 int find (int x) 16 { 17 return fa[x] == x ? x : find(fa[x]) ; 18 } 19 20 void kruskal () 21 { 22 sort (e + 1 , e + m + 1 , cmp ) ; 23 int ans = 0 , x , y ; 24 for (int i = 1 ; i <= m ; i++ ) { 25 x = find (e[i].u) ; 26 y = find (e[i].v) ; 27 if ( x != y) { 28 ans += e[i].w ; 29 fa[x] = y ; 30 } 31 } 32 printf ("%d " , ans ) ; 33 } 34 int main () 35 { 36 // freopen ("a.txt" , "r" , stdin ) ; 37 while (~ scanf ("%d" , &n ) , n ) { 38 for (int i = 1 ; i <= n ; i++) 39 fa[i] = i ; 40 m = n * (n - 1) >> 1 ; 41 for (int i = 1 ; i <= m ; i++ ) { 42 scanf ("%d%d%d" , &e[i].u , &e[i].v , &e[i].w ) ; 43 } 44 kruskal () ; 45 } 46 return 0 ; 47 }