并查集 (DSU)
并查集 (DSU)
2026/2/11
简介
并查集(Disjoint Set Union, DSU)主要用于维护若干个不相交集合,支持以下两类操作:
- 查询(find):查询某个元素所属集合(以根节点为代表).
- 合并(merge):合并两个元素所属集合.
并查集把每个集合表示成一棵树,对于每个节点 x 记录其父节点 fa[x] ,特别地,对于根节点 fa[x] = x .
实现
查询
朴素实现
cpp
|
|
路径压缩
把沿途经过的每个节点都连到根节点上.
cpp
|
|
不使用按大小/秩合并时,路径压缩递归写法遇到长链树时有爆栈风险.
路径减半
把自己连到祖父节点,然后跳到祖父节点.
cpp
|
|
路径分裂
把自己连到祖父节点,然后跳到父节点.
cpp
|
|
合并
朴素实现
cpp
|
|
按大小合并
小树挂在大树上.
cpp
|
|
按秩合并
浅树挂在深树上.
不使用路径压缩/减半/分裂时,秩就是树高;
使用路径压缩/减半/分裂后,秩不再严格等于树高,但仍可以作为合并依据.
cpp
|
|
时间复杂度
设有 个元素, 次操作.
| 实现方式 | 单次 find/merge |
总复杂度 |
|---|---|---|
| 无优化 | ||
| 仅按大小/秩合并 | ||
| 仅路径压缩/减半/分裂 | 最坏 ,均摊 | |
| 路径压缩/减半/分裂 + 按大小/秩合并 | 最坏 ,均摊 |
其中 是反阿克曼函数,增长极其缓慢,在实际应用中可视为常数.
模板
cpp
|
|