题意:给定一棵
把每条边按权值从小到大排序,扫描每条边,执行
设扫描到的边为
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
using namespace std;
int t,n;
struct edge
{
int next;
int to;
int num;
}e[24101];
int fa[6010],size[6010];
long long ans;
int getfa(int x)
{
if(fa[x]==x)
return x;
return fa[x]=getfa(fa[x]);
}
int cmp(edge a,edge b)
{
return a.num<b.num;
}
int main()
{
scanf("%d",&t);
while(t--)
{
memset(fa,0,sizeof(fa));
memset(size,0,sizeof(size));
memset(e,0,sizeof(e));
ans=0;
scanf("%d",&n);
for(int i=1;i<n;i++)
scanf("%d%d%d",&e[i].next,&e[i].to,&e[i].num);
sort(e+1,e+n,cmp);
for(int i=1;i<=n;i++)
{
fa[i]=i;
size[i]=1;
}
for(int i=1;i<n;i++)
{
int x=getfa(e[i].next);
int y=getfa(e[i].to);
if(x==y)
continue;
ans+=(long long)(size[x]*size[y]-1)*(e[i].num+1);
fa[x]=y;
size[y]+=size[x];
}
printf("%lld\n",ans);
}
return 0;
}