并查集回顾

并查集学过很久了,和其他算法一样,都快忘了。这段时间里要时不时抽一点时间出来复习一下他们了。。。废话不多说,进入正题

  网上关于并查集的介绍已经是满天飞了,所以写这篇随笔或许不能介绍出什么新东西,我能做的就是写的尽可能简单,顺便自己回顾一下。

一、什么是并查集

  并查集,顾名思义就是用来并和查的集合。首先它是一个集合,然后这个集合的主要作用是完成一些合并和查找的工作。可以结合应用深入理解。

二、并查集有什么用

  并查集最简单的应用就是类似“通畅工程”或者是找一堆人联系的方面,在这类问题中你不需要知道他们到底是什么关系,只要知道他们是哪一类就好,这种大概就是纯粹的使用并查集的方面,另外并查集在最小生成树等方面还有应用,这里咱们暂且不讨论。

三、并查集怎么用

  要表示一个集合,抽象的方式是把这个集合“用线连起来”,对!这就是树的结构,也就是说属于同一个集合的我们要把他们用线连在一起就可以表示了。就像这样:

当然我们发现对于集合来说,是完全没有必要建立这么清晰地一棵树的,也就是说我们只需要一棵很简单的树。简单到什么程度呢?答案是一个根节点其余都是他的直接子节点(这个东西大多数理解好像叫路经压缩吧,不过我觉得这样更直观)。好了这样就是说每个节点就只需要知道一个信息---父节点。这样我们用一个数组就能表示这个集合了。数组的下标表示本节点标号,值就是父节点。这样通过下面一段经典的代码就能找得到这个集合的编号(也就是父节点)啦:

1 int find(int x)
2 {
3     if(fa[x]==-1) return x;
4     return fa[x]=find(fa[x]);
5 }

当然这只是查的操作,你可能会担心并的操作会很困难,但是想多啦,并更简单

1 void Union(int x,int y)//合并函数
2 {
3     fa[y]=x;
4 }

   当然知道是什么与应用还有很大一段差距,具体可以自己练习,这个东西比较简单,主要是个思想,我就不局更多的例子了。

如果你觉得内容对你有帮助,请点个赞

知识共享许可协议
本作品采用知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议进行许可。
原文地址:https://www.cnblogs.com/MrLJC/p/3418757.html