最小生成树-kruskal算法

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int maxn = 10010;
 4 struct edge {
 5     int u, v, w;
 6 } e[maxn << 1];
 7 int n, m, fa[maxn];
 8 int get(int x) {
 9     if (x == fa[x]) return x;
10     else return fa[x] = get(fa[x]);
11 }
12 bool my_cmp(edge a, edge b) {
13     return a.w < b.w;
14 }
15 int kru(int n, int m) {
16     int sum = 0;
17     for (int i = 1; i <= n; i++) fa[i] = i;
18     sort(e + 1, e + m + 1, my_cmp);
19     for (int i = 1; i <= m; i++) {
20         int fu = get(e[i].u);
21         int fv = get(e[i].v);
22         if (fv != fu) {
23             fa[fv] = fu;
24             sum += e[i].w;
25         }
26     }
27     return sum;
28 }
29 int main() {
30     cin >> n >> m;
31     for (int i = 1; i <= m; i++) {
32         cin >> e[i].u >> e[i].v >> e[i].w;
33     }
34     cout << kru(n, m) << endl;
35     return 0;
36 }

 输入数据

  3 3

  1 2 19

  2 3 11

  3 1 7

输出数据

  18

posted @ 2018-09-26 08:25  IVAN_YAO  阅读(119)  评论(0编辑  收藏  举报