并查集

并查集(Disjoint Set Union, DSU) 是一种用于管理元素分组的数据结构,主要支持以下两种操作:

  1. 查找(Find):确定某个元素属于哪个集合。

  2. 合并(Union):将两个集合合并为一个集合。

并查集常用于解决动态连通性问题,例如判断图中的两个节点是否连通,或者合并两个连通分量。

举个例子:
可以看《啊哈算法》的第200页的并查集内容

代码实现

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <iostream>
#include <vector>

using namespace std;

class UnionFind {
private:
vector<int> parent;//存储每个节点的父节点
public:
UnionFind(int n) {
parent.resize(n);
for (int i = 0; i < n; i++)
parent[i]=i;// 初始时每个节点的父节点是自己
}
//查找操作,带路径压缩
int find(int x) {
if (parent[x] != x) {
parent[x] = find(parent[x]);//路径压缩
}
return parent[x];
}
//合并两个集合
void unionSets(int x, int y) {
parent[find(x)] = find(y);
}
//判断两个元素是否在同一个集合
bool isConnected(int x, int y) {
return find(x) == find(y);
}
};

int main() {
int n = 10;
UnionFind uf(n);
//判断1和2是否在一个集合(是否联通)
cout << uf.isConnected(1, 2) << endl;
//将1和2合并在一个集合
uf.unionSets(1, 2);
//判断1和2是否在一个集合(是否联通)
cout << uf.isConnected(1, 2) << endl;
return 0;
}