cpp
// 并查集模板
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) {
iota(parent.begin(), parent.end(), 0);
}
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;
}
};
在这个模板中,有以下几个主要函数:
UnionFind(int _n)
: 构造函数,用于初始化并查集,参数_n
表示元素的个数。findset(int x)
: 查找元素x
所属的集合的代表元素,这里使用了路径压缩的优化,可以减小查询时间。unite(int x, int y)
: 合并元素x
和y
所属的集合,即将它们连接起来。如果x
和y
已经在同一个集合中,则返回false
;否则返回true
,表示合并成功。connected(int x, int y)
: 判断元素x
和y
是否属于同一个集合,即它们是否连接在一起。
cpp
//用法
UnionFind uf(n);//初始化一个n个元素的并查集
uf.unite(x,y);//合并x和y这两个元素
uf.connected(x,y);//判断x和y这两个元素是否在同一个连通块