最小生成树-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