P9167 树形DP
城市建造
如果逆着考虑,也等价于对于分开后的每个连通块,有且只有一个点能够连非本连通块的点(有边)且连接后连通。
也就是说这是“封闭”的,删去这个点之后这个连通块就彻底断了联系,并且这里显然这个点如果存在那么唯一。
可以证明,假设我们建立出原图的 dfs 树,可以发现每个“封闭”的连通块在 dfs 树上是连通的。
假设并不连通,那么至少存在两个点会与外界有边直接相连,矛盾。
接着,我们考虑 “封闭” 性在 dfs 树上的体现。
这等价于 dfs 树上,这个连通块只能由最浅层的点往外连边,且在这个最浅层的点的子树内,所有返祖边起点在非连通块内的,返祖边的终点只能够是这个最浅层的点。
下面称所有这样的“最浅层的点”为“特殊点”。
根据这个性质,我们不妨继续推导一下可以得到如下性质:
- 一条返祖边
y\to x ,在原树链y\to x 里,设x 在这个方向的儿子是t ,那么y\to t 的状态相同(也即如果y 是特殊点,可以推出y\to t 都是特殊点,同时y 不是特殊点,则y\to t 也都不是特殊点) - 所有的 “特殊点” 在 dfs 树上是一个连通块(也就是说,删除所有的非特殊点后,所有特殊点只通过 dfs 树上的点仍然连通)。
考虑树形 DP,枚举分开后各个连通块大小
再考虑其转移,其实是将子树分为两部分,一部分接特殊点,一部分接普通子树(构成特殊点
但其实这是不必要的,若
不妨称
那么就会有如下合法情况:
- 不存在零点,我们选择一个
sz_v=B 的一点组成u 负责的连通块。 - 零点的
sz 和加一为B 或者B+1 ,则可以直接转移
在转移过程中,我们需要处理返祖边的所谓“状态相同”的限制,只需要求出 tarjan 算法中的 low 数组,并稍加讨论。
而如何算答案呢?我们枚举特殊点的连通块里最浅层的点,不妨设为
这里有个问题就是可能会计算到全部使用
对于单个
如果设特殊点个数是
常数优化:
- 当
sz<B 时不继续递归。- 在做一些判断时,判断非法后即刻终止判断。
示例代码