直接dfs算size
#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
#include<cmath>
using namespace std;
const int maxn=1000007;
struct edge{
int v,nxt,w;
}e[maxn<<1];
int p[maxn],eid=0,size[maxn],n;
/*
其实只要求出num_a(i) 就能算另一边的num 就是n-num_a(i)
w_i就等于length_i*abs(2*num_a(i)-n)
*/
bool vis[maxn];
typedef long long ll;
ll ans=0;
inline int read(){
int s=0,f=1;char c=getchar();while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();}
while(c>='0'&&c<='9') {s=s*10+c-'0';c=getchar();}
return s*f;
}
inline void ins(int u,int v,int c){
e[eid].v=v;e[eid].w=c;e[eid].nxt=p[u];p[u]=eid++;
e[eid].v=u;e[eid].w=c;e[eid].nxt=p[v];p[v]=eid++;
}
inline void init(){memset(p,-1,sizeof(p));eid=0;}
void dfs(int x){
size[x]=1;
for(int i=p[x];~i;i=e[i].nxt){
int v=e[i].v;
if(vis[v]) continue;
vis[v]=true;
dfs(v);
size[x]+=size[v];
ans+=(ll)abs((size[v]<<1)-n)*e[i].w;
}
}
int main(){
n=read();
int s,t,c;
init();
for(int i=1;i<n;i++){
s=read();t=read();c=read();
ins(s,t,c);
}
vis[1]=true;
dfs(1);
cout<<ans;
return 0;
}