class UnionFind {
public:
UnionFind(int n) { // 初始化
parent.resize(n);
rank.resize(n);
for (int i = 0; i < n; ++i) {
parent[i] = i; // 初始时,每个节点的父节点是自己
rank[i] = 1; // 结点所在集合树高为 1
}
}
void uni(int x, int y) {
int rootx = find(x); // x 的根结点
int rooty = find(y); // y 的根结点
if (rank[x] < rank[y]) {
// 把 x 合并到 y 上
parent[rootx] = rooty;
}
else if (rank[x] > rank[y]) {
// 把 y 合并到 x 上
parent[rooty] = rootx;
}
else {
// rank 相等时,把 y 合并到 x 上,同时 x 的 rank 会加 1,即深度加 1
parent[rooty] = rootx;
rank[rootx]++;
}
return;
}
int find(int x) {
if (parent[x] == x) {
return x;
}
parent[x] = find(parent[x]); // 路径压缩
return parent[x];
}
int getConnectedComponent() { // 获取连通分量个数
int res = 0;
for (int i = 0; i < parent.size(); ++i) {
if (parent[i] == i) {
++res;
}
}
return res;
}
private:
vector<int> parent;
vector<int> rank;
};
C++实现并查集
于 2022-07-31 15:14:46 首次发布