题意
原题题意足够清晰,这里不在重述。
思路
注意到本题求代价最小,考虑 DP。
设 dpidp_idpi 为根节点为 iii 的子树,通过染色使其叶子结点到该根节点的路径上至少有一个黑色结点的最小代价。
很明显,当节点 iii 是叶子节点时,只能修改自身以实现目的,顾花费为 cic_ici 。
若节点 iii 不是根节点,那么有两种方案:
1.将自己染色,这样的话自己所有的叶子结点路径上一定会遇到自己这个黑色的节点,花费 cic_ici
2.将任务交给自己的子树,求自己子树满足条件的最小花费的总和。
显然取两种方案的最小值。
顾非叶子结点的转移方程是:
dpu={cu,若 u 是叶子节点min(cu,∑v∈children(u)dpv),否则dp_u = \begin{cases} c_u, & \text{若 } u \text{ 是叶子节点} \\ \min\left(c_u, \sum\limits_{v \in \text{children}(u)} dp_v\right), & \text{否则} \end{cases} dpu =⎩⎨⎧ cu ,min(cu ,v∈children(u)∑ dpv ), 若 u 是叶子节点否则
其中 children(u)\text{children}(u)children(u) 表示节点 uuu 其儿子结点。
实现
深搜+动态规划,从根节点 111 开始,不断往下搜,若发现该节点为叶子结点,即该节点没有任何儿子节点,那么直接将其赋值 cic_ici 后回溯,在回溯途中计算根节点价值。
AC CODE