题意简述
给一棵树,树上每个节点都为灰色、白色或黑色。
每次可以选择一个连通块中的一个节点集合,要求集合中不能同时存在黑色和白色的节点,然后删去集合中所有节点。
问最少多少次可以把整棵树删完。
$n\le 200000$。
主要思路
首先玩仅有黑色和白色。
显然相同颜色的连通块可以缩成一个点,先钦定任意一条边两端颜色不同。
不难发现答案为 $\lfloor{k\over 2}\rfloor+1$,其中 $k$ 为直径的长度(点的数量)。
那么有灰色的时候,就是要把每个灰色的点赋一种颜色,使得直径最短。
不妨思考一下直径的求法:随便取一个点 $S_0$ 为根,dfs 找到树上深度最大的点 $S_1$;再以 $S_1$ 为根 dfs 找到深度最大的点 $S_2$;$S_1,S_2$ 即为直径的两个端点。
那么再次考虑仅有黑色和白色,不难发现直接套用上述算法,更改深度定义为「到根路径上极长颜色相同段个数」即可。
再考虑有灰色。
如果 dfs 到一个灰色的点,我们钦定其为其最近的非灰色祖先的颜色。
显然,(由于钦定了灰色点的颜色)产生贡献的地方仍然只有黑白间。
但是在选深度最深点的时候,灰色点应该优先级低于黑白色的点的。
就没了。
参考代码
1 |
|