并查集题目

并查集题目

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]\)

posted @ 2025-11-23 20:30  南北天球  阅读(3)  评论(0)    收藏  举报