【发布时间】:2018-11-16 06:53:55
【问题描述】:
来自https://algs4.cs.princeton.edu/42digraph/
- 最短有向环。 给定一个有向图,设计一种算法来找到边数最少的有向环(或报告 该图是非循环的)。你的算法的运行时间应该是 在最坏的情况下与 E V 成正比。
解决方案在这里:https://algs4.cs.princeton.edu/42digraph/ShortestDirectedCycle.java.html
public ShortestDirectedCycle(Digraph G) {
Digraph R = G.reverse();
length = G.V() + 1;
for (int v = 0; v < G.V(); v++) {
BreadthFirstDirectedPaths bfs = new BreadthFirstDirectedPaths(R, v);
for (int w : G.adj(v)) {
if (bfs.hasPathTo(w) && (bfs.distTo(w) + 1) < length) {
length = bfs.distTo(w) + 1;
cycle = new Stack<Integer>();
for (int x : bfs.pathTo(w))
cycle.push(x);
cycle.push(v);
}
}
}
}
除了第一行 G.reverse() 之外,该解决方案对我来说很有意义。为什么?跟拓扑排序有关系吗?
关于在有向图中查找所有循环的问题有很多,但我假设有比查找所有循环并比较它们的长度更好的方法。有一些关于寻找最短有向循环的问题,但没有一个可以接受的答案。
How can I find the shortest cycle in a Directed, Weighted Graph?
Find the Shortest Cycle in Graph
Finding shortest cycles in directed or undirected graph(这个是无向图)
我也找到了一个paper,使用了BFS,但是给出的伪代码不能用来重构路径,只能求最短循环的长度。
【问题讨论】:
-
这个问题实际上是在 Coursera 算法第 2 部分课程中提出的。考虑到课程和您的链接来自同一作者,这个答案是正确的。我看到了这个解决方案的主要思想:如果您在直图中有一些邻居,并且您可以以某种方式在反向图中到达它,那么它就是一个循环。我认为最相似的算法是 Kosaraju,它反转图以找到强连通分量。
-
@vorrtex “这个问题实际上是在 Coursera 算法第 2 部分课程中提出的。考虑到课程和您的链接来自同一作者......” 是不是有点相关?问这个问题的其他地方有什么关系,由谁提出?
标签: algorithm data-structures graph-theory breadth-first-search