并查集的定义
并查集是一种维护集合的数据结构。
支持合并和查找两个操作。
合并:合并两个集合
查找:判断两个元素是否在一个集合
并查集的实现
用一个数组 int father[N];
father[i]表示元素i的阜新节点。
father[i] = i 表示元素i为该集合的根结点,但对同一个集合来说只存在一个根节点,并将其作为所属集合的标识
例如:
father[1] = 1 //1是根节点
father[2] = 1 // 1是2的父亲结点
father[3] = 2 // 2是3的父亲结点
father[4] = 2 // 2是4的父亲结点
fatehr[5] = 5 //5是根结点
father[6] = 5 // 5是6的父亲结点
上例有两个集合,分别是以1和5为根结点的
并查集的基本操作
1.初始化
int father[N+1];
for(int i = 1;i <= N; i++){
father[i] = i;
}
2.查找
查找操作就是对给定的结点寻找根结点的过程
递推代码:
//findFather函数返回元素x所在集合的根结点
int findFather (int x){
while(x != father[x]){
x = father[x];
}
return x;
}
递归实现:
int findFather(int x){
if(x==futher[x]) return x;
else return findFather(futher[x]);
}
3.合并
把一个集合的根结点的父亲指向另一个集合的根结点
void Union(int a, int b) {
int faA = findFather(a);
int faB = findFather(b);
if(faA != faB){
father[faA] = faB;
}
}
一个重要性质:并查集产生的每一个集合都是一棵树
含路径压缩的代码
int find(int x){
return x == fa[x] ? x : fa[x] = find(fa[x]);
}