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()
。为什么?这与拓扑排序有关吗?在SO上有很多关于在有向图中找到所有循环的问题,但我假设还有比找到所有循环并比较它们的长度更好的方法。有一些关于查找最短有向循环的问题,但没有一个可以接受的答案。 如何在有向加权图中找到最短循环? 查找图中的最短循环 在有向或无向图中查找最短循环(这是针对无向图的)
我也发现了一个使用BFS的论文,但所提供的伪代码无法用于重构路径,只能用于查找最短循环的长度。