[BZOJ1060][ZJOI2007]时态同步(树形dp)

来源:互联网 发布:网络象棋 编辑:程序博客网 时间:2024/05/16 12:42

题目描述

传送门

题解

f[i]表示点i到其所在子树的叶子节点的最远距离,那么显然f[i]-f[son[i]]-c[i]表示这条边应该延迟的时间。
所以答案即为fifsonici

代码

#include<iostream>#include<cstring>#include<cstdio>using namespace std;#define LL long longconst int max_n=5e5+5;const int max_e=max_n*2;int n,s,x,y;LL z,ans,f[max_n];int tot,point[max_n],next[max_e],v[max_e];LL c[max_e];inline void add(int x,int y,LL z){++tot;next[tot]=point[x];point[x]=tot;v[tot]=y;c[tot]=z;}inline void dfs(int x,int fa){    for (int i=point[x];i;i=next[i])      if (v[i]!=fa){        dfs(v[i],x);        f[x]=max(f[x],f[v[i]]+c[i]);      }    for (int i=point[x];i;i=next[i])      if (v[i]!=fa) ans+=f[x]-f[v[i]]-c[i];}int main(){    scanf("%d%d",&n,&s);    for (int i=1;i<n;++i) scanf("%d%d%lld",&x,&y,&z),add(x,y,z),add(y,x,z);    dfs(s,0);    printf("%lld\n",ans);}
0 0
原创粉丝点击