📜  不相交集(或联合查找)的Python程序 | Set 1(检测无向图中的循环)

📅  最后修改于: 2022-05-13 01:56:56.591000             🧑  作者: Mango

不相交集(或联合查找)的Python程序 | Set 1(检测无向图中的循环)

不相交集数据结构是跟踪一组元素的数据结构,这些元素被划分为多个不相交(非重叠)子集。 union-find 算法是一种对此类数据结构执行两个有用操作的算法:

查找:确定特定元素在哪个子集中。这可用于确定两个元素是否在同一个子集中。

联合:将两个子集连接成一个子集。

在这篇文章中,我们将讨论不相交集数据结构的应用。该应用程序是检查给定图形是否包含循环。

Union-Find 算法可用于检查无向图是否包含循环。请注意,我们已经讨论了一种检测循环的算法。这是基于Union-Find的另一种方法。此方法假定图形不包含任何自环。
我们可以跟踪一维数组中的子集,我们称它为 parent[]。

让我们考虑下图:
图中的循环
对于每条边,使用边的两个顶点制作子集。如果两个顶点都在同一个子集中,则找到一个循环。

最初,父数组的所有槽都初始化为-1(意味着每个子集中只有一项)。

0   1   2
-1 -1  -1 

现在一一处理所有边。

边 0-1:找到顶点 0 和 1 所在的子集。由于它们在不同的子集中,我们采用它们的并集。要采用联合,请将节点 0 作为节点 1 的父节点,反之亦然。

0   1   2    <----- 1 is made parent of 0 (1 is now representative of subset {0, 1})
1  -1  -1

边 1-2: 1 在子集 1 中,2 在子集 2 中。所以,取并集。

0   1   2    <----- 2 is made parent of 1 (2 is now representative of subset {0, 1, 2})
1   2  -1

边 0-2: 0 在子集 2 中,2 也在子集 2 中。因此,包括这条边形成一个循环。

0 的子集如何与 2 相同?
0->1->2 // 1 是 0 的父级, 2 是 1 的父级