【问题标题】:Dijkstra's algorithm with negative edges on a directed graph有向图上具有负边的 Dijkstra 算法
【发布时间】:2011-04-19 12:14:18
【问题描述】:

如果唯一的负边成本来自初始节点怎么办?算法还能用吗?

我觉得是的,因为我想不出反例,但我很难证明这一点。有反例吗?

负边对 Dijkstra 来说是个问题,因为如果您稍后可以选择的边具有很大的负权重,则无法保证您选择的边会产生最短路径。但如果唯一的负边来自初始节点,我看不出问题。

我不是在寻找算法。我正在寻找有关 Dijkstra 的一些见解。

我说的是有向图,如果这有影响的话。

【问题讨论】:

  • 您是想找到一种可行的算法,还是想了解一下 Dijkstra 的算法?
  • 我不是在寻找算法。我把标签放在那里是因为问题是关于算法的。

标签: algorithm theory


【解决方案1】:

Dijkstra 的算法不会为具有负边权重的图生成正确答案(即使图没有任何负权重循环)。例如它计算 (A, C) 之间不正确的最短路径值,用于源顶点 A 的下图,

A -> B : 6
A -> C : 5
B -> D : 2
B -> E : 1
D -> E : -5
E -> C : -2

【讨论】:

    【解决方案2】:

    反例:

    图 G = (V, E),顶点 V = {A, B},边 E = {(A, B), (B, A)} 和权重函数 w(A, B) = -2 , w(B, A) = +1。

    存在负权重循环,因此未定义最小距离(即使使用 A 作为初始节点)。

    【讨论】:

    • Dijkstra 的算法会告诉你从 A 到 B 的最小权重路径是 [A, B],权重为 -2。但是有一些从 A 到 B 的路径的权重小于此,例如 [A, B, A, B] 的权重为 -3。
    • 标记为答案,因为我要求提供反例或证明。
    【解决方案3】:

    拥有负成本优势的问题在于,您可以随心所欲地来回走动。

    如果您强加一条边不得多次使用的规则,您仍然会遇到问题。 Dijkstra 的算法涉及将节点标记为“已访问”,当它与初始节点的距离被认为是一劳永逸的。这发生在检查所有边缘之前;已经找到了从初始节点到节点 X 的最短路径,从初始节点开始的所有其他路径都已经比这更长了,以后发现的任何东西都不能使这些路径变短。但是,如果某处存在负成本边,那么稍后的发现可以使路径更短,因此可能存在 Dijkstra 不会发现的更短路径。

    如果只有连接到初始节点的边可能有负成本,那么您仍然有问题,因为最短路径可能涉及重新访问初始节点以利用负成本,这是 Dijkstra 无法做到的。

    如果你施加一个另一个规则,一个节点不能被多次访问,那么 Dijkstra 的算法就可以工作。请注意,在 Dijkstra 算法中,初始节点的初始距离为零。如果你给它一些其他的初始距离,算法仍然会找到最短的路径——但所有的距离都会偏离相同的数量。 (如果你想要最后的真实距离,你必须减去你输入的值。)

    1. 因此,将您的图称为 A,找到连接到初始节点的任何边的最小成本,将其称为 k,在这种情况下为负数)。
    2. 制作一个新图 B,您可以通过从连接到初始节点的每条边的成本中减去 k 来获得该图。请注意,所有这些成本现在都是非负的。所以 Dijkstra 在 B 上工作。另请注意,B 中的最短路径也是 A 中的最短路径。
    3. B 的初始节点分配距离 k,然后运行 ​​Dijkstra(这将给出与初始距离为零的运行相同的路径)。将此与在 A 上天真地运行 Dijkstra 进行比较:一旦您离开初始节点 两个图中的一切都相同。距离相同,决策相同,两者将产生相同的路径。在 A 的情况下,距离将是正确的,因为它从零开始。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-27
      • 2018-01-27
      • 1970-01-01
      • 1970-01-01
      • 2018-11-15
      • 2019-04-06
      • 1970-01-01
      • 2019-07-04
      相关资源
      最近更新 更多