循环实现路径压缩
int Find(int x){
int a = x;
while(x != pre[x]){
x = pre[x];
}
while(a!=pre[x]){
int z = a;
a = pre[x];
pre[x]=x;
}
return x;
}
void join(int x,int y){
int p,q;
p = Find(x),q = Find(y);
if(p != q) pre[p] = q;
}
递归实现路径压缩
int pre[maxn];
int Find(int x){
if(pre[x] == x) return x;
return pre[x] = Find(pre[x]);
}
void join(int x,int y){
int p,q;
p = Find(x),q = Find(y);
if(p != q) pre[p] = q;
}
力扣并查集合并模板,直接用
// 并查集模板
int fa[mn], size[mn];
iota(fa, fa + mn, 0);
fill(size, size + mn, 1);
function<int(int)> find = [&](int x) -> int { return fa[x] == x ? x : fa[x] = find(fa[x]); };
auto merge = [&](int from, int to) {
from = find(from);
to = find(to);
if (from != to) {
fa[from] = to;
size[to] += size[from];
}
};