前言
终于可以有底气的显然了
思路
这道题在考场上时间不够了, 但我是做得出来的吧
在这推一遍, 检查一下
首先套路的, 先处理树在处理环
对于树上的情况, 令 \(f_{u, 0/1, 0/1}\) 表示 \(u\) 子树, 是否选择 \(u\) 为关键点, \(u\) 的儿子中是否有关键点 (显然的, 如果有一定只有一个) 的最少染色点数
考虑分类讨论, 这个不困难
\[\begin{align*}
& f_{u, 0, 0} \gets \sum_{v \in Son(u)} f_{v, 0, 1} \\
& f_{u, 0, 1} \gets \min_{p \in Son(u)} \left[ \left(\sum_{v \in Son(u)} f_{v, 0, 1}\right) - f_{p, 0, 1} + f_{p, 1, 1} \right] \\
& f_{u, 1, 0} \gets \sum_{v \in Son(u)} f_{v, 0, 0} + 1 \\
& f_{u, 1, 1} \gets \min_{p \in Son(u)} \left[ \left(\sum_{v \in Son(u)} f_{v, 0, 0}\right) - f_{p, 0, 0} + f_{p, 1, 0} \right]
\end{align*}
\]
考虑处理环上的 \(\rm{dp}\) , 假设环长为 \(d\)
首先从 \(1\) 点处把环断开
钦定 \(1\) 选择, \(d\) 不选择
钦定 \(d\) 选择, \(1\) 不选择
钦定 \(1, d\) 都不选择
这样子可以简化成链上操作, 考虑推柿子
同样的令 \(g_{i, 0/1, 0/1}\) 表示到达第 \(i\) 点, 其中这个点是否选择为关键点, 这个点的上一个点是否为关键点
容易发现的是这样子做只需要同上转移, 把花费变成 \(f\) 即可
代码
留给以后的自己
总结
常见的基环树 \(\rm{trick}\)
\(\rm{dp}\) 在可以接受的情况下, 加一维可能是可行的, 但是要注意约束的简单性, 如果构成了复杂约束一定要放弃
树形 \(\rm{dp}\) 应该也是入门了