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

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

不相交集(或联合查找)的 C 程序 | 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    Edge 1-2: 1 is in subset 1 and 2 is in subset 2. So, take union.
0   1   2    Edge 0-2: 0 is in subset 2 and 2 is also in subset 2. Hence, including this edge forms a cycle.How subset of 0 is same as 2?0->1->2 // 1 is parent of 0 and 2 is parent of 1