int find(int x){
return root[x] == x ? x:find(root[x]);
}
初始化n个元素
void init(int n)
{
for(int i=0;i<n;i++)
{
parent[i]=i;
rank[i]=0; // 初始树的高度为0
}
}
// 合并x和y所属的集合
void unite(int x,int y)
{
x=find(x);
y=find(y);
if(x==y) return ;
if(rank[x]<rank[y])
parent[x]=y; // 合并是从rank小的向rank大的连边
else
{
parent[y]=x;
if(rank[x]==rank[y]) rank[x]++;
}
}
正常
int findroot(int i)
{
if(fa[i] == i)
return i;
return fa[i] = findroot(fa[i]); //压缩路径,下次在找祖先的时候可以直接跳转几步,某些题不能压缩,比如会改父节点的题
}
int fx = findroot(l);
int fy = findroot(r);
if(fx != fy)
fa[fy] = fx;