【问题标题】:Am I thinking in the right way about this Negative weights using Dijkstra's Algorithm graph?我是否以正确的方式思考使用 Dijkstra 算法图的负权重?
【发布时间】:2017-02-08 00:49:30
【问题描述】:

我一直在试图弄清楚为什么 Dijkstra 的算法不适用于负加权图,并且我了解所有示例,这些示例具有指向已充分探索的节点的进一步节点。但是这个例子让我很头疼;

我这样想对吗?首先探索AA->B 将是 1A->C 将是 100。然后探索B 并将B->D 设置为2。然后探索 D 是因为目前它具有返回源的最短路径(即位于优先级队列的顶部)?

如果B->D100C 将首先被探索(因为A->D101),我是否正确?

人们在每个解释中都没有真正提到的一件事是,一个节点已经被探索/访问过,它不能再更新了,因为 Dijkstra 工作在优先级队列上。在这种情况下,我很难理解为什么在C 之前访问了D

【问题讨论】:

  • 你说得对。该算法仅在节点从队列中移除时已知到该节点的最短路径时才有效,并且如果稍后某个节点可能与该节点有负权链接,则该算法不一定正确。
  • 谢谢马特。你为什么不把它作为答案,我会打勾。我关于将 B->C 更改为 100 的第二个陈述是否正确?
  • 我认为我的回答不会为网站增加很多价值,所以我会留下空间以防有人想提供一个很好的解释。是的,你的第二个说法是正确的。
  • 它会失败,因为 Djikstra 的算法基于这样一个事实:当一个节点被探索/关闭时,已经找到了到该路径的最短路径。您不能说明图表中何时可能存在负权重。

标签: algorithm graph dijkstra


【解决方案1】:

很简单:当使用 Djikstra 算法的节点被探索/访问/关闭时,这意味着您已经找到了到该节点的最短路径,因此该节点不需要重新探索或重新访问,您已经知道到节点的最短路径。

例如,当您选择 D 进行探索时,PQ 中有两条路径:

  • A-B-D 成本为 2
  • A-C 成本 100

然后选择成本最低的路径。然后,很明显,如果弧线成本始终为正,则您无法找到通过 A-C 到 D 的最短路径。已找到到 D 的最短路径,节点已关闭。

但是,当允许负弧成本时,所有这些推理都不成立,这就是为什么 Djikstra 的算法不适用于他们。

【讨论】:

    【解决方案2】:

    我认为您所描述的 Dijkstra 算法仅适用于正权重函数。特别是 Dijkstra 算法在每个加权(正)图上给出了一个有效的度量空间结构。另一方面,这似乎不是任意加权图的情况。以具有两个节点 A 和 B 以及它们之间的一条边的权重 -5 为例。在这种情况下,这不会给出 A 和 B 之间的距离。所以你所描述的,我认为会属于某种修改后的 Dijkstra 模型,并且从一个节点到另一个节点的解释不能再解释为节点之间的距离.

    【讨论】:

    • 我不确定我是否遵循。我上面使用的算法仅在正权重函数上是正确的。我上面给出的解释是(我认为)导致算法无法看到 A->C->D 是最短路径的原因。
    • 在这种情况下,您对“最短路径”的定义是什么?是从 A 到 D 的边序列给你最小的权重和吗?
    • 是的,到 D 的最短路径。
    • 那么就是A->C->D。
    • 是的,我知道。我试图理解为什么 Dijkstra 的算法会看不到这一点(随后将 A->B->D 标记为答案)。
    猜你喜欢
    • 2011-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-07
    • 1970-01-01
    • 2018-01-05
    • 2015-04-19
    相关资源
    最近更新 更多