主要思想是贪心。
先将所有的边按照边权从小到大排序。
按照排好的顺序判断每一条边是否能够造成整个图中出现回路,如果不能则将该条边加入图中,并将两个顶点联通(并查集中的”并“)。
如果边的条数达到n-1,则跳出循环。此时得到的生成树便是最小生成树。
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #define MAXN 100005 using namespace std; struct edge { int u, v, w; }a[MAXN]; int n, m, cnt, sum; int f[MAXN]; int find(int x) { if(f[x] == x) return x; else return f[x] = find(f[x]); } bool cmp(edge x, edge y) { if(x.w < y.w) return 1; else return 0; } int main() { scanf("%d%d", &n, &m); for(int i=1; i<=n; i++) { f[i] = i; } for(int i=1; i<=m; i++) { scanf("%d%d%d", &a[i].u, &a[i].v, &a[i].w); } sort(a+1, a+1+m, cmp); for(int i=1; i<=m; i++) { int dx = find(a[i].u); int dy = find(a[i].v); if(dx != dy) { f[dy] = dx; cnt++; sum = sum+a[i].w; } if(cnt == n-1) break; } printf("%d", sum); return 0; } /* Input: 6 9 2 4 11 3 5 13 4 6 3 5 6 4 2 3 6 4 5 7 1 2 1 3 4 9 1 3 2 Output: 19 */