定义
并查集(Disjoint-Set)是一种可以动态维护若干个不重叠的集合,并支持合并与查询两种操作的一种数据结构。并查集可以高效地进行如下操作。
- 查询元素a和元素b是否属于同一组
- 合并元素a和元素b所在的组
:::hljs-center
:::
并查集的结构
并查集也是使用树形结构实现的,不过不是二叉树。每个元素对应一个节点,每个组对应一棵树。在并查集中,哪个节点是哪个节点的父亲以及树的形状等信息无需多家关注,整体组成一个树形结构才是重要的。
:::hljs-center
:::
具体实现
我们建立一个数组或parent[]
表示一个并查集,parent[i]
表示i
的父节点。
1. 初始化:
每一个点都是一个集合,因此自己的父节点就是自己fa[i]=i
。
for(int i = 1; i <= maxn; i++)
fa[i] = i;
2. 查询
每一个节点不断寻找自己的父节点,若此时自己的父节点就是自己,那么该点为集合的根结点,返回该点。
int Find(int x){
if(x==pre[x])
return x;
return