并查集(Disjoint Set Union, DSU)是一种数据结构,用来管理和合并不相交的集合。它主要支持两种操作:查找(Find)和合并(Union)。
简单思路:
1初始化:对于每个元素,初始化一个父节点指针数组 parent,用来记录每个元素的根节点。
int parent[MAX_SIZE]; // MAX_SIZE 为并查集最大元素个数,需要根据实际情况设置
初始时,每个元素的父节点指向自己,即 parent[i] = i。
2. 查找操作(Find):用于确定某个元素所属的集合(即找到其根节点)。
int find(int x) {
if (parent[x] != x) {
parent[x] = find(parent[x]); // 路径压缩
}
return parent[x];
}
```
这里采用了路径压缩的方式,即在查找的过程中,将当前节点直接连接到根节点,以加速后续操作。
3. 合并操作(Union):将两个集合合并为一个集合。
void union_sets(int x, int y) {
int rootX = find(x);
int rootY = find(y);
if (rootX != rootY) {
parent[rootY] = rootX; // 或者 parent[rootX] = rootY,根据需求选取
}
}
将 y所在集合的根节点指向 x所在集合的根节点,或者反之,即可完成合并操作。
### 使用示例:
#include <iostream>
using namespace std;
const int MAX_SIZE = 1000; // 假设最大元素个数为 1000
int parent[MAX_SIZE];
// 初始化,每个元素的父节点指向自己
void init(int 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 union_sets(int x, int y) {
int rootX = find(x);
int rootY = find(y);
if (rootX != rootY) {
parent[rootY] = rootX; // 或者 parent[rootX] = rootY
}
}
int main() {
int n = 10; // 假设有 10 个元素
init(n);
// 合并操作示例
union_sets(1, 2);
union_sets(3, 4);
union_sets(1, 4);
// 查找操作示例
cout << "Element 1 belongs to set with root: " << find(1) << endl;
cout << "Element 2 belongs to set with