并查集
并查集
定义
并查集是一种树形数据结构,用于处理一些不相交集合的合并,查询问题。
主要构成
一个数组,记录了每个点的前驱节点是谁;
两个函数:,用于查找指定节点属于哪个分支(集合);,合并两个节点;
作用
求连通分支数(一个图中互不连通的连通子图数);
意义
当我们判断两点是否连通时,可以往根部进行查找,只要两点可由相同的一点的分支下来那么两点就是连通的。
用集合中某个元素来代表这个集合,则该元素称为此集合的代表元。
实现
pre[]
我们用一个数组来记录每节点的前驱,比如代表5号节点的前驱节点是6号节点。如果一个节点的前驱节点是它自己,则说明此节点为根节点。
find(x)
查找所在分支的根节点,从开始通过获取它的前驱节点,重复获取直到抵达根节点。
1 | int find(int x) |
join(x,y)
合并节点,只需要让两节点对应的根节点在同一集合下即可。如果两根节点为同一节点则无需操作,否则从二者中选择一个节点作为根节点。
1 | void join(int x, int y) |
这里我们在合并的时候全部选择的根节点作为共同根节点,但是这可能会导致最后的树形结构某一分支过长。此时我们可以通过记录每个节点所在的高度,在最后合并的时候选择高度较为高的作为根节点,如果高度相等,在选择根节点之后需要将该节点的高度+1。
1 | void join(int x, int y) |
注意:此处的高度也可换为其他需要的数据。
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.





