F_JustWei's Studio.

并查集

字数统计: 317阅读时长: 1 min
2021/04/23 Share

并查集

并查集简介

并查集主要用于解决一些元素分组的问题。它管理一系列不相交的集合,并支持两种操作:

  • 合并(Union):把两个不相交的集合合并为一个集合。
  • 查询(Find):查询两个元素是否在同一个集合中。

实现并查集

路径压缩
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//初始化,每个人都是自己的爹
void init(int n) {
for (int i = 0; i <= n; i++) {
fa[i] = i;
}
}
//查询(路径压缩)
int find(int t) {
return fa[t] == t ? t : fa[t] = find(fa[t]);
}
//合并
void merge(int i, int j) {
fa[find(i)] = find(j);
}
按秩合并
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
//初始化
void init(int n) {
for (int i = 0; i <= n; i++) {
fa[i] = i;
ranks[i] = 1;
}
}
//查询
int find(int t) {
return fa[t] == t ? t : find(fa[t]);
}
//合并
void merge(int i, int j) {
int x = find(i);
int y = find(j);
//把简单的树往复杂的树上合并
//把ranks小的树往ranks大的的树上合并
if (ranks[x] <= ranks[y]) {
fa[x] = y;
}
else {
fa[y] = x;
}
if (ranks[x] == ranks[y] && x != y) {
ranks[y]++;
}
}

路径压缩和按秩合并如果一起使用,时间复杂度接近 O(n) 但是很可能会破坏 rank 的准确性。

CATALOG
  1. 1. 并查集
    1. 1.0.1. 并查集简介
    2. 1.0.2. 实现并查集
      1. 1.0.2.0.1. 路径压缩
      2. 1.0.2.0.2. 按秩合并