并查集 是一种树型的数据结构,用于处理一些不相交集合的合并和查询问题。在使用中常常以森林来表示。
基本结构
并查集也是用来维护集合的,和前面学习的 set 不同之处在于,并查集能很方便地同时维护很多集 合。如果用 set 来维护会非常的麻烦。并查集的核心思想是记录每个结点的父亲结点是哪个结点。
- 初始化
void init() {
for (int i = 1; i <= n; ++i) {
fa[i] = i;
}
}
- 查找
int get(int x) {
if (fa[x] == x) {
// x 结点就是根结点
return x;
}
return get(fa[x]); // 返回父结点的根结点 }
- 合并
void merge(int x, int y) {
x = get(x);
y = get(y);
if (x != y) { // 不在同一个集合
fa[y] = x;
}
}
并查集实现
首先,我们把要用的变量初始化。
int fa[110];
int n, m;
我们先把并查集的框架实现好,便于后面直接调用。我们先实现初始化,用一个 init() 函数来实现初 始化。初始化实际上就是把每个点的父亲结点赋值为自己。
void init() {
for (int i = 1; i <= n; i++) {
fa[i] = i;
}
}
接下来,我们继续实现get函数
int get(int x) {
if (fa[x] == x) {
return x;
}
return get(fa[x]);
}
接下里我们实现 merge 函数,合并两个结点到一个集合。合并的方法很简单,先找到各自的根结点,