并查集的定义:
并查集是一种维护集合的数据结构。
int father[N] = father_element;
/*
N为元素
father_element为父亲节点的元素,父亲节点本身也是这个集合内的元素
**例如father[2] = 1,则表明2的父亲节点是1
**father[1] = 1,则表明1的父亲节点是它本身,因此1是集合的根节点
因此可见当father[i] = i时,i为根节点
*/
对同一个集合来说只存在一个根结点,且将其作为所属集合的标识。
基本操作:
初始化:
for(int i = 1, i <= N; i++){
father[i] = i; //一开始令每一个数组都是一个独立集合
}
查找:
查找操作就是对给定的结点寻找其根节点的操作,有递推和递归两种写法。
递推:
//递推
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]);
}
合并:
合并是指把两个集合合并成一个集合。
①通过判断根节点是否相同,先判断两个元素是否属于同一个集合。
②在①中已经获得两个元素的根节点rootA和rootB,合并的方法就是将其中一个的父亲节点指向另一个节点,如father[rootA] = rootB;
void Union(int a, int b) {
int rootA = findFather(a);
int rootB = findFather(b);
if(rootA != rootB) {
father[rootA] = rootB;
}
}