并查集的应用
并查集作为一种比较容易实现的数据结构,也是有着一些很重要的应用场景,在这里做一点总结并进行理解。
基础概念
并查集的核心就是创建一个包含个整数元素的数组,为图中所有结点的个数,我们将这个数组命名为father。father[i]代表的就是第i个结点所在的树的根节点下标,初始化时,我们设father[i] = i for i in range(N)
,代表每个结点单独构成一棵树。在对图所包含的边的遍历过程中,我们逐渐更改father[i],以应对各种各样的问题和需求。虽然各种情况下需求不尽相同,但我们知道,father值相同的结点,其所属的是同一类,即他们是同一颗树下的结点。
判断是否有环
关于利用并查集来判断是否有环的问题,比较经典的是leetcode的第685题:冗余连接Ⅱ。
在本问题中,有根树指满足以下条件的有向图。该树只有一个根节点,所有其他节点都是该根节点的后继。每一个节点只有一个父节点,除了根节点没有父节点。
输入一个有向图,该图由一个有着N个节点 (节点值不重复1, 2, ..., N) 的树及一条附加的边构成。附加的边的两个顶点包含在1到N中间,这条附加的边不属于树中已存在的边。
结果图是一个以边组成的二维数组。 每一个边 的元素是一对 [u, v],用以表示有向图中连接顶点 u 和顶点 v 的边,其中 u 是 v 的一个父节点。
返回一条能删除的边,使得剩下的图是有N个节点的有根树。若有多个答案,返回最后出现在给定二维数组的答案。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/redundant-connection-ii
题目的思路其实就是联系到环。具体有两种情况:
- 冗余边指向有根树的根节点。此时构成的图必然有一个有向环;
- 冗余边指向其他的结点。此时虽然也有环,但并不是有向环。
剩下的问题,就是如何利用并查集来判断环形结构了。这里,我用图形的形式来进行解释。