什么是查并集
并查集实际上是数据结构树的简单应用,是一种用树来表示集合的数据结构,比如集合A和集合B,如图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/d1793200e0fb126d7a1c56784d0ce652.png)
我们可以用一个数组来顺序表示一个树形集合中的各个结点,如图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/3ceada46f4a9df0ee0dd8ab264815c0a.png)
除0号位置外,数组中的每个位置的内容,是其对应结点的双亲结点的下标;第0号位置,也就是对应着根结点,储存的是这个集合中结点个数的相反数。
查并集的应用
并查集的“查”,判断两个结点是否属于同一个(树形)集合:
要查询任意两个结点是否属于同一个(树形)集合,只需要分别查寻这两个结点对应的数组内容,得到其双亲结点所在的位置下标,以此来查双亲结点的双亲结点,即由数组底部一直往上查询,直到查到两个结点各自的根结点。如果这两个结点的根结点是相同的,则说明它们在同一个集合中,换句话说,这两个结点是相连通的。
实现代码:
int find(int *parent, int x) { //查询元素x在集合中的根结点
while(parent[x] > = 0)
x = parent[X]; //循环寻找x的根
//根的parent小于0
return x;
}
在一个树形集合中,如果将任意两个结点直接相连,那么集合中就会形成回路。以集合A为例,将A中的2,3结点相连,就形成了12
3
1回路:
![](https://i-blog.csdnimg.cn/blog_migrate/2f2884b6b430d03ebebb703c3f36ef2e.png)
可以利用这一特性来辅助构建最小生成树(卡鲁思卡尔算法)。
并查集的“并”,将多个(树形)集合合并:
要将多个(树形)集合合并为一个集合,只需要将一个集合的根结点作为另一个集合的根结点的子孩子就可以了。比如将上述的集合A和集合B合并为一个集合,如图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/936bb7fa0c146b95366b1dd502fac0d7.png)
反应在数组上:
![](https://i-blog.csdnimg.cn/blog_migrate/de4b4f9b48845e61bd3373c3dc8c0117.jpeg)
只需要修改集合B的根结点对应的数组值,将其改为0即可。
实现代码:
void Union(int parent, int root1, int root2) {
parent[root2] = root1;
}