查并集(第二天集训时光结束了,小累小累)
合并父节点:`
void join(int x, int y) {//将x的父节点与y的父节点合并
if (cfind(x) != cfind(y)) {
fa[cfind(x)] = cfind(y);//把x的最终父节点改为y的最终父节点,可实现将x路径与y路径合并。
}
}
找父亲:
int cfind(int x) {//普通查找
int r = x;
while (fa[r] != r) {
r = fa[r];
}
return r;
}
抄近道找父亲(压缩路径find):
int qfind(int x){
int a=x; //把初始值赋给a
while(x!=fa[x]){
x=fa[x]; //找到x的祖先节点
}
/*接下来让a到最终父节点之间的所有节点都改变为x的父节点*/
while(a!=x){ //直到a==x为止
int temp=fa[a]; //设一个中间变量为a的父亲节点
fa[a]=x; //直接让b的父亲节点为x的祖先节点
a=temp; //a等于a的父亲节点
}
return x;
}