[BZOJ1060] [ZJOI2007]时态同步
2016-02-28 22:59
561 查看
传送门
http://www.lydsy.com/JudgeOnline/problem.php?id=1060题目大意
给定一棵树及其边权,在边上权值不断+1,使根到所有叶子节点的距离都相同询问最小+1的次数
题解
树形DPf[i]:表示以i为根的子树中,根到最深节点的距离f[i]:表示以i为根的子树中,根到最深节点的距离
ans=∑f[i]−f[son[i]−w[i,son[i]]ans=\sum f[i]-f[son[i]-w[i,son[i]]
{$M 100000000,0,100000000} uses math; const maxn=500005; var w:array[0..3*maxn,1..3]of longint; f:array[0..maxn]of longint; i,j,k:longint; a,b,c,n,m,len,root:longint; ans:int64; procedure init(a,b,c:longint); begin w[len,1]:=b; w[len,2]:=c; if w[a,3]=0 then w[a,3]:=len else w[w[a,1],3]:=len; w[a,1]:=len; inc(len); end; procedure dfs1(a,fa:longint); var tt:longint; begin tt:=w[a,3]; f[a]:=0; while tt<>0 do begin if w[tt,1]<>fa then begin dfs1(w[tt,1],a); f[a]:=max(f[a],f[w[tt,1]]+w[tt,2]); end; tt:=w[tt,3]; end; end; procedure dfs2(a,fa:longint); var tt:longint; begin tt:=w[a,3]; while tt<>0 do begin if w[tt,1]<>fa then begin ans:=ans+f[a]-f[w[tt,1]]-w[tt,2]; dfs2(w[tt,1],a); end; tt:=w[tt,3]; end; end; begin readln(n); len:=n+1; readln(root); for i:=1 to n-1 do begin readln(a,b,c); init(a,b,c); init(b,a,c); end; dfs1(root,0); ans:=0; dfs2(root,0); writeln(ans); end.
相关文章推荐
- uva10714 - Ants
- 九度OJ 1396(DP) 1397(尺取法) 1398(最值) 1399(背包,DP) 1401(未完成)
- Android学习笔记day10
- vim 命令
- Windows NLB
- hdu1019(快排&&欧几里得)
- [简单实用系列] 微信分享
- React Native环境配置
- 动态规划算法
- Java中数字格式化问题
- Android 蓝牙对等通信初探
- 数组溢出与指针问题
- Android Studio 报:AndroidManifest.xml (系统找不到指定的路径。) 错误
- https
- 准备1千万个随机数字,保存到文件并顺序读取
- ajax原理和XmlHttpRequest对象
- 机电传动控制初认识
- nginx安装及编译参数详解
- Study Note: Instruction Optimisation of CUDA programming
- Study Note: Instruction Optimisation of CUDA programming