SDUT ACM 2144 最小生成树,克鲁斯卡尔模板 Anti

图结构练习——最小生成树

Time Limit: 1000MS    Memory limit: 65536K

题目描述

 有n个城市,其中有些城市之间可以修建公路,修建不同的公路费用是不同的。现在我们想知道,最少花多少钱修公路可以将所有的城市连在一起,使在任意一城市出发,可以到达其他任意的城市。
 

输入

 输入包含多组数据,格式如下。
第一行包括两个整数n m,代表城市个数和可以修建的公路个数。(n<=100)
剩下m行每行3个正整数a b c,代表城市a 和城市b之间可以修建一条公路,代价为c。
 

输出

 每组输出占一行,仅输出最小花费。

示例输入

3 2
1 2 1
1 3 1
1 0

示例输出

2
0

 

 1 #include<stdio.h>
 2 #include<algorithm>
 3 struct Edge
 4 {
 5     int u, v, w;
 6 }edge[10010];
 7 
 8 int n, m, set[110];
 9 
10 int cmp(const struct Edge x, const struct Edge y)
11 {
12     return x.w < y.w;
13 }
14 
15 int find(int x)
16 {
17     while(x != set[x])
18         x = set[x];
19     return x;
20 }
21 
22 int Kruskal()
23 {
24     int ans = 0;
25     for(int i = 1; i <= n; i++)
26         set[i] = i;
27     std::sort(edge, edge+m, cmp);
28     for(int i = 0; i < m; i++)
29     {
30         int x = find(edge[i].u);
31         int y = find(edge[i].v);
32         if(x != y)
33         {
34             ans += edge[i].w;
35             set[x] = y;
36         }
37     }
38     return ans;
39 }
40 
41 int main()
42 {
43     while(~scanf("%d %d", &n, &m))
44     {
45         for(int i = 0; i < m; i++)
46             scanf("%d %d %d", &edge[i].u, &edge[i].v, &edge[i].w);
47         printf("%d\n", Kruskal());
48     }
49     return 0;
50 }
原文地址:https://www.cnblogs.com/wolfred7464/p/3019839.html