Author: lllyouo
Date: 20250225
tag: 最小生成树、并查集
link: https://www.acwing.com/problem/content/348/问题描述
分析
考虑 Kruskal 算法的执行过程:当两个连通块合并时,存在一条边
参考代码
cpp
#include <bits/stdc++.h>
using namespace std;
const int N = 6010;
struct NODE {
int u, v, w;
bool operator < (const NODE& x) {
return w < x.w;
}
} e[N];
int t, n, p[N], siz[N];
int find(int x) {
if (x == p[x]) return p[x];
return p[x] = find(p[x]);
}
int main() {
cin >> t;
while (t--) {
cin >> n;
for (int i = 0; i < n - 1; i++) {
cin >> e[i].u >> e[i].v >> e[i].w;
}
sort(e, e + n - 1);
for (int i = 1; i <= n; i++) p[i] = i, siz[i] = 1;
int ans = 0;
for (int i = 0; i < n - 1; i++) {
int fu = find(e[i].u);
int fv = find(e[i].v);
if (fu != fv) {
ans += (e[i].w + 1) * (siz[fu] * siz[fv] - 1);
p[fv] = fu;
siz[fu] += siz[fv];
}
}
cout << ans << endl;
}
return 0;
}