本文稍后补全,以下内容来自https://blog.csdn.net/weixin_60702024/article/details/142111877
编写函数,实现并查集的基本操作(查找、合并)。
分析实现
并查集中包含数据结构parent
数组,存储每个结点的父结点。
对于查找操作,可以通过递归找到当前结点的根结点,然后进行路径压缩——令当前结点的父结点为根节点,最后返回根节点。
对于合并操作,只需要将两节点的根结点进行合并即可。
具体实现如下:
class UnionFind {
private:
vector<int> parent;
public:
UnionFind(int n) {
// 构造函数,对parent数组进行初始化
parent.resize(n);
for (int i = 0; i < n; ++i) {
parent[i] = i;
}
}
// 查找操作,带路径压缩
int find(int x) {
// 当前结点就是根节点
if(parent[x]==x){
return x;
}
// 当前结点不是根节点 - find(parent[x])找到根节点,赋值于parent[x]进行路径压缩,并返回根节点
else{
return parent[x] = find(parent[x]);
}
}
// 合并操作
void unionSets(int x, int y) {
int rootX = find(x);
int rootY = find(y);
if (rootX != rootY) {
parent[rootX] = rootY;
}
}
};
总结
以上就是并查集的查找和合并操作的实现。
此处的重点在于理解find
函数路径压缩操作和具体的实现方法。
而合并操作还可以继续优化——按秩合并,此处不再过多介绍。