图论杂题选做 #2
Problem A. P13548 [OOI 2022] Air Reform
暴力的想法是,建出补图,补图的边权用 Kruskal 重构树来求,然后再求补图的 Kruskal 重构树,最后算答案。
但是补图的边数太多了,不能直接建。考虑枚举边权,也就是在原图的重构树上从叶子到根进行考虑,尽量早合并。
假设现在考虑到重构树上的节点 \(x\),需要把左右儿子的连通块合并起来,其中有一些限制边。
启发式合并连通块,假设左儿子 \(siz\) 较小。设左儿子连通块集合为 \(L\),右儿子的为 \(R\)。枚举 \(L\) 中的所有连通块 \(S_i\),枚举所有点 \(x\),枚举 \(R\) 中所有连通块 \(T_j\),枚举 \(T_j\) 中所有点 \(y\)。如果 \(x,y\) 没有限制边,那么就合并 \(S_i,T_j\),把 \(T_j\) 从 \(R\) 中删去;处理完 \(S_i\) 后,将其扔进 \(R\) 里,继续考虑下一个 \(S\)。
若 \(x,y\) 之间没有连边,会直接合并,只有 \(O(n)\) 次。 所以只需要计算 \(x,y\) 这条边被枚举多少次。
当 \((x,y)\) 第一次被枚举时,把这个贡献摊给边;后面再被枚举,只可能是 \(x,y\) 本来都在 \(L\) 里,\(x\) 又被扔进 \(R\),处理 \(y\) 时又一次枚举到这条边。由于我们 \(L,R\) 是启发式合并,每个点合并次数不会超过 \(\log n\) 次,所以 \((x,y)\) 最多会被枚举 \(\log n+1\) 次。
启发式合并用 set 维护,复杂度 \((m\log^2 m)\)。
https://www.luogu.com.cn/record/258474973