并查集操作:
init: for(int i=1;i<=N;i++){
father[i]=i;
}
search: int findFather(int x){
while(x!=father[x]){
x=father[x];
}
}
int findFather(int x){
if(x==father[x])return x;
else return findFather(father[x]);
}
judge: bool judge(int x,int y){
if(findFather(x)==findFather(y)) return true;
else return false;
}
merge: void merge(int x,int y){
int fx=findFather(x);
int fy=findFather(y);
if(x!=y) return;
else father[x]=y;
}
优化: int findbetter(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 findbetter(int x){
if(x==father[x])return x;
else {
int F=findbetter(father[x]);
father[v]=F;
return F;
}
}