思路:
考虑两个连通块合并,把所有不连的边赋为w+1
c o d e code code
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
long long t, n, fa[1010100], siz[1010100];
struct node
{
long long x, y, w;
}a[1010100];
bool cmp(node x, node y)
{
return x.w<y.w;
}
long long find(long long x)
{
if(x==fa[x])
return x;
return fa[x]=find(fa[x]);
}
int main()
{
scanf("%lld", &t);
while(t--)
{
long long ans=0;
scanf("%lld", &n);
for(long long i=1; i<n; i++)
scanf("%lld%lld%lld", &a[i].x, &a[i].y, &a[i].w), fa[i]=i, siz[i]=1;
fa[n]=n, siz[n]=1;
sort(a+1, a+n, cmp);
for(long long i=1; i<n; i++)
{
long long fx=find(a[i].x);
long long fy=find(a[i].y);
if(fx!=fy)
{
ans=ans+(long long)(siz[fx]*siz[fy]*(a[i].w+1)-1);
fa[fy]=fx;
siz[fx]+=siz[fy];
}
}
printf("%lld\n", ans);
}
return 0;
}