繁体   English   中英

在有向图中找到所有循环路径

[英]Find all cyclic paths in a directed graph

标题是不言自明的。 这是我在互联网上找到的一个解决方案,可以帮助做到这一点。 这是链接

我不明白为什么不访问权重低于给定阈值的顶点会解决问题。

另外,我不知道如何使用/不使用它来解决这个问题。

让我们将其限制为简单循环 - 那些不包含子循环的循环。 对于图中的每个节点,开始对该节点进行深度优先搜索。 记录导致匹配的递归树的每个分支。 搜索时,永远不要跨越分支中已经遍历过的节点。

考虑在 n 个顶点上的完整有向图。 有 n(n-1) 条弧和 n! 长度为 n 的简单循环。 上面的算法根本没有比这差多少。 至少在最坏的情况下,简单地构建答案的新副本将花费几乎与运行上述算法一样多的时间。

如果您想在有向(甚至无向)图中找到循环,有一种直观的方法可以做到:

For each edge (u, v) in the graph
     1. Temporarily ignore the edge (u, v) in step 2
     2. Run an algorithm to find all paths from v to u (using a backtrackig algorithm)
     3. Output the computed paths in step 2 along with the edge (u, v) as cycles in the graph

请注意,您将通过这种方式获得重复的循环,因为将找到 k 次长度为 k 的循环。

您也可以利用这个想法来查找具有特定属性的循环。 例如,如果您的目标是在图中找到最短的加权循环,而不是找到所有循环。 您可以在步骤 2 中使用 Dijkstra,并在您找到的所有循环中取最小值。 如果您想找到具有最少边数的循环,您可以在步骤 2 中使用 BFS。

如果您在查找图中的所有路径方面更加挣扎,这个问题可能对您有所帮助。 虽然这是一个稍微不同的问题。

使用回溯计算/寻找路径

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM