class UnionFind {
public:
vector<int> parent;
vector<int> size;
int n;
int setCount;
public:
UnionFind(int _n): n(_n), setCount(_n), parent(_n), size(_n, 1) {
for(int i=0;i<_n;i++)
parent[i]=i;
}
int findset(int x) {
return parent[x] == x ? x : parent[x] = findset(parent[x]);
}
bool unite(int x, int y) {
x = findset(x);
y = findset(y);
if (x == y) {
return false;
}
if (size[x] < size[y]) {
swap(x, y);
}
parent[y] = x;
size[x] += size[y];
--setCount;
return true;
}
bool connected(int x, int y) {
x = findset(x);
y = findset(y);
return x == y;
}
bool disconnected(int x) {
parent[x] = x;
return true;
}
};
C++并查集模板
于 2021-12-10 12:53:07 首次发布