题目描述
样例
input:
1
5
4 2 1 5 7
1 2 4
1 3 5
4 2 9
5 2 3
output:
23
题目大意
给定一棵树,每条边有权值,点上也有权值。现有一个初始 H p = 0 Hp=0 Hp=0的人,如果经过边,那么 H p Hp Hp减去边权,如果经过点,那么会加上点权。为了保证任何时刻 H p ≥ 0 Hp\ge 0 Hp≥0,他可以随时休息1分钟,然后增加1 H p Hp Hp。如果每个点的点权只能加一次,每条边只能经过两次,那么如果这个人从1号结点开始,遍历所有点回到1号结点所需要休息的最多时间是多少。
分析
我们考虑遍历整棵树意味着什么。
首先肯定是遍历根,然后挑一个子树遍历,最后回到根,然后再挑一个遍历。那么对于每个子树其实遍历的方式是一样的。所以,遍历整棵树可以分成若干棵子树的遍历。这就是树形 d p dp dp了。
那么我们要定义状态:
- req[i] 表示 i i i结点为根的子树的答案。
- data[i] 表示遍历 i i i的子树后 H p Hp Hp的变化,可能为负。
那么根据这个,可以写出 d a t a data data的转移式子:
d a t a [ x ] = ∑ ( d a t a [ s o n ] − 2 ∗ e . v ) + v a l [ x ] data[x]=\sum(data[son]-2*e.v)+val[x] data[x]=∑(data[son]−2∗e.