下面模版为并查集(路径压缩)
int fa[maxn];
int fin(int f){
return f==fa[f]?f:fa[f]=fin(fa[f]);
}
下面模版为并查集(非路径压缩+按秩(树高)合并),查找为
O
(
l
o
g
(
n
)
)
O(log(n))
O(log(n))
合并时:秩低的为树根指向秩高的树根
int fa[maxn],mxd[maxn]; //mxd为秩的值
int fin(int f){
return f==fa[f]?f:fin(fa[f]);
}
void unin(int u,int v){
int fu=fin(u),fv=fin(v);
if(mxd[fu]>mxd[fv]) swap(fu,fv);
fa[fu]=fv;
mxd[fv]=max(mxd[fv],mxd[fu]+1);
}