【问题标题】:Can I use Dijkstra algorithm for negative weighted graph?我可以将 Dijkstra 算法用于负加权图吗?
【发布时间】:2013-05-12 12:16:40
【问题描述】:

我知道 Bellman Ford 算法适用于负加权图,但我开发了一个运行良好的 Dijkstra 算法代码。但是当我插入负加权边缘时它会失败。有什么解决办法吗?

【问题讨论】:

标签: algorithm graph-theory dijkstra


【解决方案1】:

我认为我们不能那样做,因为 Dijkstra 算法不会找到到达目标顶点的最终方法,因为它可能会陷入循环,它不是为负加权图设计的,你应该使用 bellman ford 算法

【讨论】:

    【解决方案2】:

    实际上,在特殊情况下是可能的Dijkstra algorithm 将失败,如果有一个负长度的边缘。但是,如果所有边的长度都是负数,那么您可以反转所有边的长度并使用该算法找到图的两个顶点之间的最长路径(该路径将表示原始图中的最短路径)。

    但在一般情况下,正如您所说,不可能使用 Dijkstra。如果没有负长度的循环,则应使用 Bellman-Ford 算法。如果你不能保证没有负长度的循环,那么问题是 NP-complete 并且没有已知的多项式算法。

    【讨论】:

    • 干得好,谢谢你的链接.....我从来不知道,感谢例外情况
    【解决方案3】:

    正如您所说,Bellman Ford 是在具有负权重的图中找到最短路径的首选算法。在这种情况下使用 Dijkstra 算法的问题在于,Dijkstra 假设图中从 s 到 t 的所有可能子路径都必须小于目标子路径,这在添加负边权重时不一定正确。

    【讨论】:

      【解决方案4】:

      如果所有边的权重都是正数,这可以保证向路径添加更多边会使其更长。知道这一点后,Dijkstra 的算法将丢弃任何比它找到的到某个顶点的最短路径更长的路径,因为长路径不可能比短路径短。

      但是,如果存在负边权重,则此假设不成立,因为我们可能会丢弃一条非常长的路径 P,但是在某个地方,P 可以通过非常负的边并变得比最短路径短你目前有。因此,我们不能保证我们找到的路径在 Dijkstra 算法的任何阶段都是最短的,而该算法依赖于该算法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-05-01
        • 2016-05-07
        • 1970-01-01
        • 1970-01-01
        • 2011-10-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多