并查集通过find和merge操作管理集合合并与查询,使用路径压缩和按秩合并优化效率。初始化parent数组使每个节点指向自身,rank记录树高;find递归查找根并压缩路径,merge比较rank决定合并方向,避免退化为链表;二者结合使操作均摊复杂度接近O(α(n))。示例中创建5元素并查集,依次合并0-1-2和3-4,验证连通性后合并两组,最终0与4连通。

在C++中实现并查集的合并操作,核心是通过“按秩合并”或“路径压缩”优化来高效地管理集合的连接关系。并查集(Union-Find Set)常用于处理不相交集合的合并与查询问题,比如判断两个元素是否属于同一集合、动态连通性问题等。
并查集通常用一个数组 parent[] 来表示每个节点的父节点,初始时每个节点的父节点指向自己。另外可以使用 rank[] 数组记录每棵树的“秩”(近似高度),用于优化合并策略。
示例代码结构:
#include <iostream>
#include <vector>
using namespace std;
class UnionFind {
private:
vector<int> parent;
vector<int> rank;
public:
UnionFind(int n) {
parent.resize(n);
rank.resize(n, 0);
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 merge(int x, int y) {
int rootX = find(x);
int rootY = find(y);
if (rootX == rootY) return; // 已在同一集合
// 按秩合并:将低秩树接到高秩树下
if (rank[rootX] < rank[rootY]) {
parent[rootX] = rootY;
} else if (rank[rootX] > rank[rootY]) {
parent[rootY] = rootX;
} else {
parent[rootY] = rootX;
rank[rootX]++; // 秩相同,合并后根的秩加1
}
}
// 判断是否在同一集合
bool connected(int x, int y) {
return find(x) == find(y);
}
};
merge 函数是并查集中实现集合合并的核心方法:
这两个优化能显著提升效率:
立即学习“C++免费学习笔记(深入)”;
下面是一个简单调用示例:
int main() {
UnionFind uf(5); // 创建5个元素的并查集
uf.merge(0, 1);
uf.merge(1, 2);
uf.merge(3, 4);
cout << uf.connected(0, 2) << endl; // 输出 1(true)
cout << uf.connected(0, 3) << endl; // 输出 0(false)
uf.merge(2, 3);
cout << uf.connected(0, 4) << endl; // 输出 1(true)
return 0;
}
基本上就这些。掌握 find 和 merge 的写法,加上路径压缩和按秩合并,就能写出高效的并查集。实际应用中根据题目需求选择是否使用 rank 优化,但建议默认加上以保证性能稳定。
以上就是c++++中如何实现并查集的合并_c++并查集合并方法的详细内容,更多请关注php中文网其它相关文章!
c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号