题目链接:​​传送门​

构造一个完全图就是每两个点之间都有一条边
要使最小生成树不变那么多加的边只能相比原来的边更大
在构造生成树时如果两个点集的大小分别为AcWing 346. 走廊泼水节_并查集,那么需要加的边就是AcWing 346. 走廊泼水节_生成树_02
需要加的边权是这条树边的边权AcWing 346. 走廊泼水节_i++_03,这样才保证加的边权最小
一边构造生成树一边维护并查集的AcWing 346. 走廊泼水节_生成树_04就好

#include <bits/stdc++.h>
#define

using namespace std;
struct node {
int a, b, w;
friend bool operator < (const node a, const node b) {
return a.w < b.w;
}
}e[A];
int T, n, m, siz[A], fa[A];
int find(int x) {return fa[x] == x ? x : fa[x] = find(fa[x]);}

int main(int argc, char const *argv[]) {
cin >> T;
while (T--) {
scanf("%d", &n); int ans = 0;
for (int i = 1; i <= n; i++) fa[i] = i, siz[i] = 1;
for (int i = 1; i < n; i++) scanf("%d%d%d", &e[i].a, &e[i].b, &e[i].w);
sort(e + 1, e + n);
for (int i = 1; i < n; i++) {
int fx = find(e[i].a), fy = find(e[i].b);
if (fx == fy) continue;
ans += abs(siz[fx] * siz[fy] - 1) * (e[i].w + 1);
fa[fy] = fx; siz[fx] += siz[fy];
}
cout << ans << endl;
}
return 0;
}