// 初始化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 find(int x) //查找x元素所在的集合,回溯时压缩路径
{
if (x != parent[x])
{
parent[x] = find(parent[x]); //回溯时的压缩路径
} //从x结点搜索到祖先结点所经过的结点都指向该祖先结点
return parent[x];
}
转载于:https://www.cnblogs.com/ukcxrtjr/p/11194356.html