并查集题目
并查集题目
P1197 JSOI2008 星球大战
通过倒序处理把删点变成加点,并查集时维护连通块个数。
P1783 海滩防御
类似与 Kruskal,把塔与塔间的距离的一半,塔与第 \(0\) 列和第 \(n\) 列的距离压入边集数组后按权值从小到大排序,一直加边直到第 \(0\) 列和第 \(n\) 列相连,这个用并查集判断。
P1525 NOIP 2010 提高组 关押罪犯
只需尽可能使权值大的边的两个端点的分别在两个组,用并查集维护分组即可。
P2024 NOI2001] 食物链
三倍种类并查集,区间 \([1,n]\) 表示 \(A\) 类,区间 \([n+1,2n]\) 表示 \(B\) 类,区间\([2n+1,3n]\) 表示 \(C\) 类。
由于不知道具体的类别,每一次操作我们需要对三类并查集同时合并。
- 操作 \(1\):判断不同类的并查集是否有联系,在三类并查集各自合并。
- 操作 \(2\):判断是否在同一类并查集和是否不同类之间有反向关系,在不同类并查集之间合并。
P1196 NOI2002 银河英雄传说
容易想到,用辅助数组 \(len[u]\),表示当前点到队头的距离。
路径压缩时有 $ len[u] = \sum len[fa] $,其中 \(u\) 是当前点,\(fa\) 是 \(u\) 的路径压缩后的各个祖先。
为了在合并时正确维护 \(len[u]\),我们还需要维护并查集大小 \(siz[u]\),当 \(u\) 为队头时,\(siz[u]\) 表示当前集的大小,否则为 \(0\)。
对于合并队头 \(v\) 到 \(u\),需要把 \(len[v]+=len[u]\) 和 \(siz[u]+=siz[v]\)。

浙公网安备 33010602011771号