对于一条边来说,其理论最大贡献值为z*min(sonsum[lefnode],sonsum[rignode])。如果考虑所有配对都经过树的重心,那么可以做到所有边的贡献值都为理论最大贡献值。dfs计算下即可。
#include<bits/stdc++.h>
using namespace std;
const int MAXN=100100;
struct edge
{
long long x,w;
}etmp;
vector<edge> eg[MAXN];
int n;
int sonsum[MAXN];
long long dfs(int x,int fa)
{
long long ret=0;
sonsum[x]=1;
for(int i=0;i<eg[x].size();i++)
{
if(eg[x][i].x==fa)
continue;
ret+=dfs(eg[x][i].x,x);
ret+=eg[x][i].w*min(n-sonsum[eg[x][i].x],sonsum[eg[x][i].x]);
sonsum[x]+=sonsum[eg[x][i].x];
}
return ret;
}
int main()
{
int i,x,y;
while(~scanf("%d",&n))
{
for(i=1;i<n;i++)
{
scanf("%d%d%d",&x,&y,&etmp.w);
etmp.x=y;
eg[x].push_back(etmp);
etmp.x=x;
eg[y].push_back(etmp);
}
printf("%lld\n",dfs(1,-1));
}
}