【问题标题】:Dijkstra Algorithm for Negative Weights负权重的 Dijkstra 算法
【发布时间】:2015-05-04 09:27:21
【问题描述】:

现在我知道如果图形包含负权重边,Dijkstra 将无法工作。但有一个例外。 (只有离开源的边可以有负权重,而所有其他边必须是正的。)

我希望能够证明这一点。我不知道如何开始。我已经制作了一些图表,并且所有这些 Dijkstra 最终都能完美运行,但我不明白如何证明这一点?

所以我真正想要的是有人证明 Dijkstra 在这种情况下可以工作或不会(只有来自源的传出边是负的。)

另外,图表不能包含任何涉及源的循环。

【问题讨论】:

  • 这个例外是不正确的。考虑一个图a->b->c->a,其中a 是源,w(a,b) = -5, w(b,c)=w(c,a)=1 该图有一个负循环,并且没有到任何节点的最短路径。
  • 你的意思是说不存在负长度的循环吗?
  • 对不起,我需要提一下,图中没有涉及源的循环。
  • @Codor 如果唯一的负边离开源,这两个声明是等价的。

标签: algorithm dijkstra


【解决方案1】:

首先注意,如果没有涉及源的循环,我们可以修剪图的任何进入源的边,它不会影响结果,在Dijkstra的算法中不会到达导致源的顶点无论如何(否则,有一个涉及源的循环)。

从现在开始,我们将假设源没有传入边缘。

请注意,松弛步骤(三角不等式)所需的声明:d(u,v) <= d(u,x) + w(x,v) 必须(空虚地)为每个w(x,v) < 0 成立,唯一的u 存在从ux 的路径(其中是源)是u=x=source,路径是空路径。

这将我们引向d(u,x) + w(x,v) = 0 + w(x,v) = w(u,v) = d(u,v)(其中u 是源),不等式仍然成立。

【讨论】:

    【解决方案2】:

    您可以简单地将一般初始实例 D 转换为可行实例 D'(即,仅包含正边缘值的实例),然后表明 Dijkstra 的算法在两个实例上的行为相同。由此您可以得出结论,Dijkstra 的算法在 D 形式的实例上是正确的。

    以下是详细内容:

    您可以通过插入一个只有一条边的“超级源”s' 将 D 转换为 D' - 距离 d(s',s) = -min{d(s,x) 的输出到 s |x 是一个节点}。这个实例等价于将 d(s',s) 添加到 s 的所有出边的实例,我们称之为 D';它只有正边权重。

    Dijkstra 算法在 D 和 D' 上的行为与队列中距离的排序保持相同,因此相同的节点以相同(移动的)距离等方式解决。请注意,在这个论点中,我们隐含地使用没有包含 s 的(负)循环。

    因为我们知道 Dijkstra 算法在 D' 上找到了变换后图的正确距离,并且 D 和 D' 的最短路径的结构必须相同,我们可以得出结论,Dijkstra 算法在 D 形式的实例上是正确。

    注意:您始终可以使用所谓的 Johnson Shift 来让 Dijkstra 的算法在没有负循环的图上正确执行。您也可以使用 Johnson Shift 进行证明,但这不是独立的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-11
      • 2015-04-19
      • 1970-01-01
      • 2021-08-12
      • 2018-01-27
      • 2012-10-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多