P2515-软件安装-树形DP-题解

原题链接:Link

思路分析

树形 DP 打多了就容易不看题,这个题并没有要求依赖关系形成一棵树,而是可能出现循环依赖。

所以要先用 tarjan 缩点,之后再把所有连通块的根连接到超级源点。(注意顺序!!!一个环是没有根的,所以要先缩点再连超级源)

之后是普通的树上背包:定义 \(f_{u,k}\) 表示以 \(u\) 为根的子树最大代价为 \(k\) 能够获得的最大价值。处理的过程中,如果当前处理到儿子 \(v\),则 \(f_{u,k}=\max_{j=c_{u}}^{k}{(f_{u,j}+f_{v,k-j})}\)。感性理解一下,就是考虑多少代价分配给 \(v\),剩下的代价分配给 \(u\) 和那些已经处理过的儿子。

AC 代码