循环有向图和无向图
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 来获取图中强分量的数量。然后,您可以检查强连通分量数是否等于顶点数。因为如果有向图中存在环,那么同一个强连通分量中至少有两个顶点。这意味着如果有向图有环,则强连通分量的总数应小于顶点数。
【讨论】:
以上是关于循环有向图和无向图的主要内容,如果未能解决你的问题,请参考以下文章