P8399 [CCC2022 S5] Good Influencers 做题记录
题意简述
给定一棵 $n$ 个点的树,点有蓝色和白色两种颜色,每次选择一个蓝点 $u$ 并将所有距离为 $1$ 的点染成蓝色,代价为该点的点权 $w_u$,求将树全变为蓝色的最小代价。$n\le 2\times 10^5$。
思路
树 DP。
每个点要么被父亲染成蓝色,要么被儿子染成蓝色。设 $f_{u,0/1/2/3}$ 为对于 $u$ 子树内所有节点都被染成蓝色,$u$ 被选择,父亲需要被选择 / $u$ 不被选择,父亲需要被选择 / $u$ 被选择,父亲不需要被选择 / $u$ 不被选择,父亲不需要被选择。
在 $u$ 下方加入一个儿子 $v$。则有转移:
- 对于 $f_{u,0}$ 的转移,$u$ 被选择,则对 $v$ 不做要求,任意状态均可转移。$f_{u,0}\gets f_{u,0}+\min\{f_{v,0},f_{v,1},f_{v,2},f_{v,3}\}$。
- 对于 $f_{u,1}$ 的转移,$u$ 不被选择,则需要 $v$ 不依赖 $u$ 染成蓝色。$f_{u,1}\gets f_{u,1}+\min\{f_{v,2},f_{v,3}\}$。
- 对于 $f_{u,2}$ 的转移,$u$ 被选择,则对 $v$ 不做要求。同时应当考虑 $v$ 将 $u$ 染色的情况,此时 $v$ 应当满足被选择且不依赖父亲染色。$f_{u,2}\gets\min\{\min\{f_{v,0},f_{v,1},f_{v,2},f_{v,3}\}+f_{u,2},f_{u,0}+f_{v,2}\}$。
- 对于 $f_{u,3}$ 的转移,$u$ 不被选择,则需要 $v$ 不依赖 $u$ 染成蓝色。应当考虑 $v$ 将 $u$ 染色的情况,$v$ 同样应当满足被选择且不依赖父亲染色。$f_{u,3}\gets\min\{\min\{f_{v,2},f_{v,3}\}+f_{u,3},f_{u,1}+f_{v,2}\}$。
初始值 $f_{u,0}\gets w_u,f_{u,1}\gets 0$。如果 $u$ 一开始为蓝色,则 $f_{u,2}\gets w_u,f_{u,3}\gets 0$。否则 $f_{u,2}\gets +\infty,f_{u,3}\gets +\infty$。
Code
转移时应当注意顺序,不过更好的方式是使用临时数组来存储原来的 DP 值。
1 |
|
P8399 [CCC2022 S5] Good Influencers 做题记录
https://www.llingy.top/posts/3915593363/