首先定义好存储并查集的数组
const int N = 10000;
int father[N];
其中father[i]的值表示第i个节点的父节点,也就是说i节点属于father[i]所在的集合。
如果father[i] == i那么就表示节点i是根节点,也就是说节点i是自己所在集合的根节点。
并查集的初始化
void initial(){
for(int i=0;i<N;i++){
father[i] = i;
}
}
并查集的查找操作
①、迭代实现
int findFather(int x){
while(x!=father[x]){
x = father[x];
}
return x;
}
② 递归实现
int findFather1(int x){
if(x == father[x]) return x;
else return findFather(father(x));
}
并查集的合并操作
int Union(int a,int b) {
int Fa = findFather(a);
int Fb = findFather(b);
if(Fa!=Fb)
father[Fa] = Fb;
}
并查集的路径压缩(所谓的路径压缩其实就是把每一个节点都指向它所属的集合的根节点)
int findFather(int x){
int a = x;
while(x!=father[x]){
x = father[x];
}
while(a!=father[a]){
int z = a;
a = father[a];
x = father[z];
}
return x;
}