Copy of
| 2020-9-21
0  |  0 分钟

并查集解决问题

并查集往往用于解决图上的问题,并查集只有两个操作,“并” 和 “查”,但是通过这两个操作可以派生出一些其他的应用:
  • 图的连通性问题
  • 集合的个数
  • 集合中元素的个数
图的连通性很好理解,一个图是不是连通的是指,“如果是连通图,那么从图上的任意节点出发,我们可以遍历到图上所有的节点”, 这里我们只需要将在图上的节点放到相同的集合中去,然后去看是不是所有的节点均指向同一个集合即可;集合的个数就是找代表元素的个数,查找某个集合中元素的个数最简单的方式就是直接遍历 roots 数组,然后挨个 find,另外一种方法是在结构中多保存一个数组用来记录每个集合中元素的个数,并根据具体的操作来更改。
反过来我们也要思考一个问题就是,什么问题是并查集所不能解决的?并查集的合并操作是不可逆的,你可以理解成只合不分,也就是说两个集合合并之后就不会再分开来了,另外并查集只会保存并维护集合和元素的关系,至于元素之间的关系,比如图上节点与节点的边,这种信息并查集是不会维护的,如果遇到题目让你分析诸如此类的问题,那么并查集并不是一个好的出发点,你可能需要往其他的算法上去考虑。
 

代码如下:

 
参考文章
目录