贡献者: 有机物
1并查集(disjoint-set)是一个树形、用于维护不相交的集合的数据结构。
对于并查集,主要有如下操作:
定义集合的表示方法:“代表元” 法,即每个集合都会选择一个固定的元素,作为这个集合的代表。其次需要定义归属关系的表示方法:使用一个树形结构存储每个集合,树上的每个结点都是一个元素,树根是集合的代表元素。我们用 p[i]
表示每个结点的父结点,初始化 p[i]
都指向自己,树根也指向自己。在合并两个集合时,只需要将其中一个树根的父结点指向另一个树根,即 p[root_1] = root_2
。在查询每个集合的树根时,朴素的办法就是通过 p[i]
存储的值不断递归访问父结点,直至到达树根。为了提高效率,我们引入了路径压缩这种优化方法。
在进行合并和查询的操作中,我们只关心每个集合的根结点,所以我们在
还有一种优化方法为按秩合并,单独采用 “按秩合并” 的并查集每次
并查集的存储:
int p[N]
并查集的初始化:
起初所以元素各自构成一个独立的集合,即有
并查集的
并查集的
如果想维护集合的大小呢?可以开一个 cnt
数组用于维护集合的大小,最初每个集合的大小初始化为
在 cnt[b] += cnt[a];
,加之前需要判断
以上就是并查集的基本操作了。
友情链接: 超理论坛 | ©小时科技 保留一切权利