树上计算size模拟算答案。
Luogu
#include <cstdio>
#include <iostream>
#include <algorithm>
#define ll long long
using namespace std;
const int maxm=1100000;
int head[maxm],net[maxm*2],to[maxm*2],cnt;
ll ans=0,cost[maxm*2],n;
inline void add(int x,int y,ll c)
{
to[++cnt]=y;
cost[cnt]=c;
net[cnt]=head[x];
head[x]=cnt;
}
ll absx(ll x)
{
if(x<0) return -x;
return x;
}
ll dfs(int now,int fax)
{
ll size=1,k=2;
for(int i=head[now];i;i=net[i])
if(to[i]!=fax)
{
ll d=dfs(to[i],now);
size+=d;
ans+=absx(n-k*d)*(ll)cost[i];
}
return size;
}
int main()
{
scanf("%lld",&n);
for(int i=1;i<n;i++)
{
int u,v;
ll c;
scanf("%d%d%lld",&u,&v,&c);
add(u,v,c),add(v,u,c);
}
dfs(1,0);
return printf("%lld",ans)*0;
}