1、初始化
for(int i=1,i<=N;i++)
{
father[i]=i;
}
2、查找
int findFather(int x)
{
while(x!=father[x])
{
x=father[x];
}
return x;
}
递归版本 :
int findFather(int x) //递归版本
{
if(x==father[x]) return x;
else return findFather(father[x]);
}
3、合并
void Union(int a,int b)
{
int faA=findFather(a);
int faB=findFather(b);
if(faA!=faB)
{
father[faA]=faB;
}
}
4、路径压缩
①、递推实现
int findFather(int x)
{
int a=x;
while(x!=father[x])
{
x=father[x];
}
while(a!=father[a]) //从底向上,再走一遍!
{
int z=a; //z暂时保存a的值 ps:可以想象为两个指针
a=father[a]; //a向上走一步
father[z]=x;
}
}
②、递归实现
int findFather(int v)
{
if(v==father[v]) return v;
else
{
int F=findFather(father[v]);
father[v]=F;
return F;
}
}