IOI2021 D1T2 keys

在做过 JOI Open 2019 的某题 后感觉这题能套同样的做法。

对于每个点我们是可以 \(O(n+m)\) bfs 求出答案的。

考虑直接套病毒实验的做法。一开始把每个点染不同的颜色,下面把同颜色的点称作一个连通块。

并查集维护若干连通块,连通块只保留一个所有点能到它的点(代码中的并查集的根),也就是连通块中能到达的点数量最少的点。(其他的点不用管,因为只要求达到点数最小的)

然后每次从保留的点开始 bfs 找。

bfs 到不同连通块的就合并两个连通块并返回,当前连通块的那个点可以直接废了,保留那个不同连通块的点就行了。

不能到不同连通块就说明这个点能到的位置已经确定,以后可以不再 bfs 这个连通块,并更新答案即可。

每轮会连通块数量至少除以 \(2\),这样只会经过 \(\log\) 轮 bfs,复杂度为 1log。

然后就做完了,十分好写(

可以配合代码理解。

posted @ 2022-01-11 11:24  Rainbow_qwq  阅读(126)  评论(0编辑  收藏  举报