图论 - 树论 - 生成树 - Kruskal
图论 - 树论 - 生成树 - Kruskal
题目链接: https://www.luogu.org/problem/P3366
代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 5010;
const int M = 200010;
int n, m;
int tot, head[N], fa[N];
struct Edge {
int u, v, val;
} e[M];
bool cmp(Edge A, Edge B) {
return A.val < B.val;
}
int find(int x) {
if (fa[x] == x) {
return x;
}
return fa[x] = find(fa[x]);
}
int Kruskal() {
sort(e + 1, e + m + 1, cmp);
int cnt = 0, ret = 0;
for (int i = 1; i <= m; i ++ ) {
int fx = find(e[i].u);
int fy = find(e[i].v);
if (fx == fy) {
continue ;
}
fa[fx] = fy;
cnt ++ ;
ret += e[i].val;
}
if (cnt == n - 1) {
return ret ;
}
return -1;
}
int main() {
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i ++ ) {
fa[i] = i;
}
for (int i = 1; i <= m; i ++ ) {
scanf("%d%d%d", &e[i].u, &e[i].v, &e[i].val);
}
int ans = Kruskal();
if (ans == -1) {
puts("orz");
return 0;
}
printf("%d\n", ans);
return 0;
}