Description
给定一棵 $n\ (1 \leq n \leq 1500)$ 个节点的树,点 $i\ (1 \leq i \leq n)$ 的花费是 $val_i\ (1 \leq val_i \leq 10^4)$,现在需要从中选择若干个点,这些点能够覆盖与它们相连的点,求覆盖树上所有点的最小代价是多少。
Source
Solution
考虑 树形DP 。
状态:
用 $f_{0,u}$ 表示在节点 $u$ 的子树中,所有点都已经被覆盖,其中节点 $u$ 被自己覆盖的最小代价;
用 $f_{1,u}$ 表示在节点 $u$ 的子树中,所有点都已经被覆盖,其中节点 $u$ 被它儿子覆盖的最小代价;
用 $f_{2,u}$ 表示在节点 $u$ 的子树中,除节点 $u$ 外的点都已经被覆盖,其中节点 $u$ 将被它父亲覆盖的最小代价。
初始:
无
转移:
若节点 $u$ 被自己覆盖,则至少要花费 $val_u$ 的代价,同时子节点 $v$ 的状态不需要考虑,因为无论怎样 $v$ 都会被 $u$ 覆盖,所以还需要加上 子节点所有状态的最小值 。
若节点 $u$ 被它儿子覆盖,则子节点 $v$ 不可能被它的父节点 $u$ 覆盖,因此需要取子节点 被自己覆盖 和 被其儿子 覆盖的较小值。但是所取的子节点肯定不能全部被自己的儿子覆盖,否则节点 $u$ 将不会被覆盖。因此如果所有的 $f_{1,v}$ 都比 $f_{0,v}$ 更优,那么需要从中挑出一个 $f_{1,v}$,把它变成 $f_{0,v}$,这样才能满足 $u$ 被 $v$ 覆盖。为了让变化所花费的代价更小,我们需要找到 $f_{0,v}$ 与 $f_{1,v}$ 的最小差值,加上原来的代价即可。
若节点 $u$ 被它父亲覆盖,则子节点 $v$ 不可能被它的父节点 $u$ 覆盖,所以只需要加上子节点 被自己覆盖 和 被其儿子 覆盖的较小值即可。
答案:
因为根节点没有父亲,所以不需要考虑根节点被父亲覆盖的情况,答案应该取根节点 被自己覆盖 和 被儿子覆盖 的较小值。因为本题是棵无根树,所以直接设 $1$ 号节点为根,连无向边即可。
时间复杂度为 $O(n)$ 。
Code
1 |
|