一、并查表的用处
一般由于检测图的连通性问题。给你一幅图,和图中两个结点,请问这两个结点是否相连通?或者检测该图中是否有环。当然还可解决其他问题。
二、并查表的构成
由find函数,join函数,以及对应的集合的代表结点数组构成。
像黑社会这种组织,都是老大说了算,老大的手下都是跟着老大做事,可以这么说老大一定程度上是手下的代表,一个老大代表了他所有的手下。将元素都归于集合中,这就是并查表的主要思想。一个人也可以是一个黑社会团体哦
如果对集合概念了解的,可以理解为,将一个个结点(手下)放入到不同的集合(黑社会团体)中,对应的集合的代表结点数组 表示不同的集合(用集合中的一个元素代表该集合)(老大代表了黑社会团体),join函数 的作用是将结点放入到集合中,亦或者将两个集合并操作(两个黑社会黑吃黑,一个黑社会吞并另一个黑社会)。find函数 的作用是给一个结点,找到该结点对应集合的代表结点。(给一个手下找到他所属黑社会的老大)
三、例题剖析
- 冗余连接
在本问题中, 树指的是一个连通且无环的无向图。
输入一个图,该图由一个有着N个节点 (节点值不重复1, 2, …, N) 的树及一条附加的边构成。附加的边的两个顶点包含在1到N中间,这条附加的边不属于树中已存在的边。
结果图是一个以边组成的二维数组。每一个边的元素是一对[u, v] ,满足 u < v,表示连接顶点u 和v的无向图的边。
返回一条可以删去的边,使得结果图是一个有着N个节点的树。如果有多个答案,则返回二维数组中最后出现的边。答案边 [u, v] 应满足相同的格式 u < v。
题目来源:leetcode 684 冗余连接
题目要求可简化为,该无向图中含有一环,请找出该环中一个连接。
解该题的方法有很多,这里只写出使用并查表的解决方案。
举一个例子:
假设输入是:
[[1,4],[3,4],[1,3],[1,2],[4,5]]
可视化的图
很明显,1 - 4 - 3 是一个环,按道理来讲, 返回[1 , 4],[3, 4] 或者 [1, 3] 都可,而题目中要求 如果