之前重来没有重视过这个东西,后来才发现这东西是个很基础且很重要的东西,这里记录下按秩合并的路径压缩并查集,话说这种事比较好用的。分析就不写了,代码很清晰易懂,我的另一篇文章中也有用到并查集,最小生成树和并查集有很深的联系。参考https://blog.csdn.net/qq_36459536/article/details/79893858
#include<assert.h>
class UnionFind {
private:
int* parent;
int* rank; // rank[i]表示以i为根的集合所表示的树的层数
int count;
public:
UnionFind(int count) {
parent = new int[count];
rank = new int[count];
this->count = count;
for (int i = 0; i < count; i++) {
parent[i] = i;
rank[i] = 1;
}
}
~UnionFind() {
delete[] parent;
delete[] rank;
}
int find(int p) {
assert(p >= 0 && p < count);
while (p != parent[p])
p = parent[p];
return p;
}
bool isConnected(int p, int q) {
return find(p) == find(q);
}
void unionElements(int p, int q) {
int pRoot = find(p);
int qRoot = find(q);
if (pRoot == qRoot)
return;
if (rank[pRoot] < rank[qRoot]) {
parent[pRoot] = qRoot;
}
else if (rank[qRoot] < rank[pRoot]) {
parent[qRoot] = pRoot;
}
else { // rank[pRoot] == rank[qRoot]
parent[pRoot] = qRoot;
rank[qRoot] += 1;
}
}
};