for(int i=1;i<=n;i++){ //初始化
father[i]=i;
}
int Find(int x){ //查找父节点 递归
if(x!=father[x]){
x=Find(father[x]);
}
return x;
}
int Find(int x){ //递推
while(x!=father[x]){
x=father[x];
}
return x;
}
void Union(int a,int b){ //合并
int x=Find(a);
int y=Find(b);
if(x!=y){
father[x]=y;
}
return ;
}
int Find(int x){ //路径压缩 递推
int a=x;
while(x!=father[x]){
x=father[x];
}
while(a!=father[a]){
int z=a;
a=father[a];
father[z]=x;
}
return x;
}
int Find(int x){ //递归
if(x==father[x]){
return x;
}
else{
int F=Find(father[x]);
father[x]=F;
return F;
}
}