BZOJ_1060_时态同步_树形DP
BZOJ_1060_时态同步_树形DP
题意:http://www.lydsy.com/JudgeOnline/problem.php?id=1060
分析:水水的树形DP。
用儿子的最大值更新父亲,边更新边累加ans。
代码:
#include <stdio.h> #include <string.h> #include <algorithm> using namespace std; #define N 1000010 #define LL long long int head[N],to[N<<1],nxt[N<<1],val[N<<1],cnt,n,root; LL ans,f[N]; inline void add(int u,int v,int w){ to[++cnt]=v;nxt[cnt]=head[u];head[u]=cnt;val[cnt]=w; } void read(int &x){ int f=1;x=0;char s=getchar(); while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();} while(s>='0'&&s<='9'){x=(x<<3)+(x<<1)+s-'0';s=getchar();} x*=f; } void dfs(int x,int y){ LL sum=0; for(int i=head[x];i;i=nxt[i]){ if(to[i]!=y){ dfs(to[i],x); sum=max(sum,f[to[i]]+val[i]); } } f[x]=sum; for(int i=head[x];i;i=nxt[i]){ if(to[i]!=y){ ans+=sum-(f[to[i]]+val[i]); } } } int main(){ read(n);read(root); int x,y,z; for(int i=1;i<n;i++){ read(x),read(y),read(z); add(x,y,z);add(y,x,z); } dfs(root,0); printf("%lld",ans); }