并查集

并查集一般用于:

  1. 将两个集合合并

  2. 询问两个元素是否在一个集合当中

    基本原理:

每个集合用一棵树来表示。

树根的编号就是整个集合的编号。

每个节点存储他的父节点,使用pre[x]表示x的父节点

问题:

  1. 如何判断树根?答 if pre[x] == x

  2. 如何求x的集合编号?答 while pre[x] != x: x = pre[x]

  3. 如何合并两个集合?答 如何需要合并的两个集合为a、b,那么将b插入到a中即可(或将a插入b中)即pre[b]=a

优化:

  1. 路径压缩(常用):从某个节点a找到其所在集合的根节点r,那么可以将a到根节点路径上各点x直接指向根节点,即使得pre[x] = r

  2. 按秩合并(不常用):对于每个集合有一个rank值,在合并两个集合的时候将rank值较小的插入到rank值较大的中

模版题:合并集合

image-20200712220313785

维护元素个数:连通块中点的数量

image-20200712222053278

注意:连通块中的点指的是两点之间是连通的,比如从点a可以访问到点b,从点b可以访问到点a,那么a、b两点之间就是连通的,是连通块中的点。

Python并查集模版

普通版

按秩合并

路径压缩

练习

参考

【图解】遇到就深究——并查集

并查集总结

最后更新于

这有帮助吗?