【题目链接】
http://www.lydsy.com/JudgeOnline/problem.php?id=1060
【题意】
求最少的增加量,使得以rt为根的树中由一个结点出发的所有到叶子结点的路长相等。
【思路】
树形DP。
设f[u]为以u为根的子树中到叶子的最大路长,只要把其他的所有路长都增加到f[u]就可以了。
【代码】
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std; typedef long long ll;
const int N = 5e5+; struct Edge {
int v,w,nxt;
}e[N<<];
int en=,front[N];
void adde(int u,int v,int w)
{
en++; e[en].v=v,e[en].w=w,e[en].nxt=front[u],front[u]=en;
} int n,rt;
int f[N]; ll ans; ll read()
{
char c=getchar(); ll f=,x=;
while(!isdigit(c)) {if(c=='-')f=-; c=getchar();}
while(isdigit(c)) x=x*+c-'',c=getchar();
return x*f;
} void dfs(int u,int fa) {
for(int i=front[u];i;i=e[i].nxt) {
int v=e[i].v;
if(v!=fa) {
dfs(v,u);
f[u]=max(f[u],f[v]+e[i].w);
}
}
for(int i=front[u];i;i=e[i].nxt)
if(e[i].v!=fa) ans+=f[u]-f[e[i].v]-e[i].w;
} int main()
{
n=read(),rt=read();
for(int i=;i<n-;i++) {
int u=read(),v=read(),w=read();
adde(u,v,w),adde(v,u,w);
}
dfs(rt,-);
printf("%lld\n",ans);
return ;
}
合影留念 :)