题目大意:n个点,建立生成树,边的费用等于道路长度乘以道路两端的国家个数之差的绝对值,给定方案,求费用
题解:树形dp,会dfs就可以做了
我的收获:这是noi……
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int M=1000005;
int n,t,head[M],sz[M];
long long ans;
struct edge{int to,nex,val;}e[M*2];
void add(int i,int j,int w){e[t].to=j,e[t].nex=head[i],e[t].val=w,head[i]=t++;}
void dfs(int x,int fa){
sz[x]=1;
for(int i=head[x];i!=-1;i=e[i].nex){
int v=e[i].to;
if(v==fa) continue;
dfs(v,x);sz[x]+=sz[v];
ans+=(long long)e[i].val*abs((n-sz[v])-sz[v]);// have known sz[v],not sz[x]……
}
}
void work()
{
dfs(1,0);
cout<<ans<<endl;
}
void init()
{
int x,y,z;
cin>>n;t=0;
memset(head,-1,sizeof(head));
for(int i=1;i<n;i++)
scanf("%d%d%d",&x,&y,&z),add(x,y,z),add(y,x,z);
}
int main()
{
init();
work();
return 0;
}