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