循环有向图和无向图

Posted

技术标签:

【中文标题】循环有向图和无向图【英文标题】:Cyclic directed and undirected graphs 【发布时间】:2014-04-14 18:17:39 【问题描述】:

如何检测循环中的循环

    有向图 无向图。

对于无向图.. 我想到的一种算法是使用不相交集。

对于 G 中的每个顶点 v 制作组(v) 对于 G 中的每个边 e(u,v) 一个接一个 如果查找集(u) == 查找集(v) return true // 循环存在 返回假

【问题讨论】:

您的方法称为 union-find,是的,它可用于在无向图中查找循环。或者,只需执行 DFS 并查看您之前是否遇到过节点。对于有向图,使用修改后的 DFS 来跟踪您在当前探索期间查看的内容,并在您从 DFS 回滚时标记未访问的内容。 Cycles in an Undirected Graph 和 Best algorithm for detecting cycles in a directed graph 的可能重复项。我在 Stack Overflow 上找不到不相交集循环检测的好链接,但 that works. 您显然试图自己解决(部分)问题,因此可能不值得投反对票,但就个人而言,我认为您在提问之前也应该始终进行 Google 搜索。 【参考方案1】:

对于无向的,只需use a DFS:如果一条边指向一个已经访问过的顶点,则存在一个循环。

有指导的请看at this question。

【讨论】:

【参考方案2】:

您在无向图中找到循环的方法应该是这样的:

对于 G 中的每个顶点 v Meke-set(v) 对于 G 中的每个边 e(u,v) 一个接一个 如果查找集(u) == 查找集(v) 返回真 联合集(u, v) 返回假

对于有向图,您应该使用Tarjan's strongly connected components algorithm 来获取图中强分量的数量。然后,您可以检查强连通分量数是否等于顶点数。因为如果有向图中存在环,那么同一个强连通分量中至少有两个顶点。这意味着如果有向图有环,则强连通分量的总数应小于顶点数。

【讨论】:

以上是关于循环有向图和无向图的主要内容,如果未能解决你的问题,请参考以下文章

有向图和无向图的环检测

无向图和有向图的详细讲解

无向图的基本算法

树是有向图还是无向图?

无向图的深度优先搜索和广度优先搜索

C Language 图 - 有向图 && 无向图 术语(十七)