IOI2021 D1T2 keys
在做过 JOI Open 2019 的某题 后感觉这题能套同样的做法。
对于每个点我们是可以 \(O(n+m)\) bfs 求出答案的。
考虑直接套病毒实验的做法。一开始把每个点染不同的颜色,下面把同颜色的点称作一个连通块。
并查集维护若干连通块,连通块只保留一个所有点能到它的点(代码中的并查集的根),也就是连通块中能到达的点数量最少的点。(其他的点不用管,因为只要求达到点数最小的)
然后每次从保留的点开始 bfs 找。
bfs 到不同连通块的就合并两个连通块并返回,当前连通块的那个点可以直接废了,保留那个不同连通块的点就行了。
不能到不同连通块就说明这个点能到的位置已经确定,以后可以不再 bfs 这个连通块,并更新答案即可。
每轮会连通块数量至少除以 \(2\),这样只会经过 \(\log\) 轮 bfs,复杂度为 1log。
然后就做完了,十分好写(
可以配合代码理解。