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

时间:2019-08-29 21:31:23

标签: algorithm graph-algorithm

标题不言自明。这是我在互联网上找到的可以帮助实现此目的的解决方案。这是link

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

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

如果要在有向(甚至无向)图中查找循环,则有一种直观的方法:

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。

如果您在查找图形中的所有路径时更加费劲,此问题可能会对您有所帮助。尽管这是一个稍微不同的问题。

Counting/finding paths with backtracking