For the i-th test case , first output Case #i: in a single line , then output
N lines , for the i-th line , output
ans[i] in a single line.
1 5 4 1 7 7 7 1 2 6 1 3 1 2 4 8 3 5 2
Case #1: 15 10 14 9 15
一道颇为恶心的树形dp,要考虑的细节挺多的,想了好久死了一堆脑细胞。
首先,理解题意以后,我们可以知道,如果要计算从某一个点出发的最优值,可以进行一次dfs
以1作为根节点为例,图中我们可以先走1-2在回来2-1在去1-3再到3-5,这样可以得到1 2 3 5四个点的价值减去中间经过的边
可以看出一点,从1出发经过很多的分支,最后一条分支是不需要再回来的。
所以进行树形dp,需要记录三个值,从这个节点向下每次都回来的最优值g[x],
从这个节点向下最后一次不会来的最优值和次优值dp[x][0]和dp[x][1],顺便记录不会来的是哪一条边f
这样,第一次以1为根的dp可以求出dp[1][0]为1节点的答案,接下来通过这个推导下面相邻节点的答案。
对于x的某个孩子来说,有两种情况,
一种是它向下走不回来,显然这在这在之前的dp中可以得到。
另一种是向上走,这就和x节点的最优值选了那条边有关,如果是选择当前边,那么加上之前的次优值,
不然就加上之前的最优值,当然要先和0比一下,因为可能不走过去。
这样就能推出全部的答案了。
#include
#include