P2515 [HAOI2010]软件安装
题意简述
现在我们的手头有 \(N\) 个软件,对于一个软件\(i\) ,它要占用 \(W_i\) 的磁盘空间,它的价值为 \(V_i\) ,我们希望从中选择
一些软件安装到一台磁盘容量为 \(M\) 计算机上,使得这些软件的价值尽可能大(即 \(V_i\) 的和最大),软件之间存
在=依赖关系,即软件 \(i\) 只有在安装了软件\(j\) (包括软件 \(j\) 的直接或间接依赖)的情况下才能正确工作(软件 \(i\) 依
赖软件 \(j\) ),幸运的是,一个软件最多依赖另外一个软件
解题思路
可以把软件之间的依赖关系看成一条有向边,只有选择了祖先才能选择孙子结点,这样就可以直接跑树上背包了
但是题目中可能会有环的情况,这个时候就要用 \(tarjan\) 先缩点了,根据题目中的描述可以知道,在环上的点,
要么都选,要么都不选,所以缩点后把环内所有的点的价值的重量都累积起来就行了
但是即便如此,我们依旧无法保证图是一棵树,它有可能是一个森林,所以我们需要建一个虚点,并将它把所有
入度为 \(0\) 的点相连,它的价值和重量都设为 \(0\)
然后就可以开始DP了,设 \(f_{u,i}\) 表示在 \(u\) 这个点,花费 \(i\) 的限制,能获得的最大价值,因为软件之间的依赖关系
所以初始化为 \(f_{u,i}=v_u,i\in [w_u,m]\),分别枚举 \(i∈[0,m?w_u]\) 表示对所有子树的限制,\(j∈[0,i]\) 表示对当
前子树的限制
code
#include
#include
#include
#include
#include