【问题标题】:How to find the shortest directed cycle in a directed graph?如何在有向图中找到最短的有向环?
【发布时间】:2018-11-16 06:53:55
【问题描述】:

来自https://algs4.cs.princeton.edu/42digraph/

  1. 最短有向环。 给定一个有向图,设计一种算法来找到边数最少的有向环(或报告 该图是非循环的)。你的算法的运行时间应该是 在最坏的情况下与 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


【解决方案1】:

G.reverse() 是一个与G 相同的有向图除了,每条边都是相反的;因此,例如,如果 G 的边从 vw,那么 G.reverse() 的边从 wv

由于bfs取自G.reverse()vbfs.hasPathTo(w)表示“G是否有路径来自 w @ 987654335@”,bfs.distTo(w) 表示“Gwv 的路径长度”。 (如果bfs 取自G 而不是G.reverse(),它将检测到相反方向的路径。)

所以它使用的循环查找算法是:对于G 中的每条边(v,w),测试G 是否有从w 回到v 的路径。

不涉及拓扑排序。

【讨论】:

  • 为什么不为每个v 检查bfs.hasPathTo(v)
  • @AbhijitSarkar:我想bfs.hasPathTo(v)bfs.distTo(v)bsf.pathTo(v) 将始终返回true0 和空路径(分别)。当然也可以改成忽略空路径;恕我直言,如果BreadthFirstDirectedPaths 也用于其他用途,您发布的代码才有意义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-02
  • 2014-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多