class UF{
vector<int> pre, size;//pre存储的是当前节点的根节点;size存储所属树的节点数量,用于小树向大树合并
public:
UF(int n):pre(n), size(n, 1){
iota(pre.begin(), pre.end(), 0);//初始化数组为0到n-1
}
int Find1(int x){
return x == pre[x]? x : (pre[x]=Find(pre[x]));//后面的pre[x]=find(pre[x])路径压缩,下次查找更快
}
int Find(int x){
while (x != pre[x]) {
pre[x] = pre[pre[x]]; // 路径压缩,使得下次查找更快
x = pre[x];
}
return x;
}
void Union(int x, int y){
int px=Find(x), py=Find(y);
if(px != py){
if(size[px] < size[py]){
pre[px] = py;
size[py] += size[px];
}else{
pre[py] = px;
size[px] += size[py];
}
}
}
bool isConnected(int x, int y){
return Find(x) == Find(y);
}
};
并查集模板
于 2023-01-04 10:12:12 首次发布