理解为什么Dijkstra算法在带有负边的图上失败的解释?

时间:2015-12-22 06:25:29

标签: algorithm graph-algorithm dijkstra

我正在阅读Sanjoy DasGupta所着书籍中存在负边缘的最短路径(第122页)

http://beust.com/algorithms.pdf

  

Dijkstra的算法部分原因是因为最短路径来自   起始点s到任何节点v必须通过节点专门传递   比v更接近。当边长可以时,这不再成立   负。在图4.12中,从S到A的最短路径通过   B,距离更远的节点。

    (S,A) = 3, (S,B)=4, (B,A)= =2



S-----3--------A
   |           ^
   |           |
   4          -2
   |           |
   |           |
   B----------->
  

为了适应这种新的需要改变什么   并发症?要回答这个问题,请采取特定的高级视图   Dijkstra算法。一个关键的不变量是dist值   它维持总是高估或完全正确。他们   从无穷远处开始,他们改变的唯一方法就是   沿边缘更新

procedure update((u; v) belongsto E)
dist(v) = min{dist(v), dist(u) + l(u,v)}
  

这个更新操作只是表达了这样一个事实   到v的距离不能超过到u的距离,加上   l(u,v)。它具有以下属性。   1.在特定情况下,它给出了与v的正确距离,其中u是v的最短路径中的倒数第二个节点,而dist(u)是   正确设定。   它永远不会使dist(v)太小,从这个意义上说它是安全的。例如,一系列无关紧要的更新不会造成伤害。

     

此操作非常有用:它是无害的,如果使用的话   仔细,将正确设置距离。事实上,Dijkstra的算法   可以简单地将其视为一系列更新。我们知道这一点   特定的序列不适用于负边缘,但是存在   其他一些序列呢?要了解这个属性   序列必须拥有,让我们选择一个节点t并查看最短的节点   s的路径。

我对上述文字的疑问是

  1. 作者对第二财产的意思是什么? "它永远不会使dist(v)太小,从这个意义上说它是安全的。例如,一系列无关紧要的更新不会造成伤害。"我无法理解这个
  2. 作者的意思是"我们知道这个特定的序列不适用于负边缘,但是还有其他一些序列吗?"我不是以英语为母语的人,难以理解这句话吗?

1 个答案:

答案 0 :(得分:1)

对于你的第一个问题 - 声明"它永远不会使dist(v)太小"意思? - 我认为作者指的是Dijkstra算法的特定属性:如果你看看Dijkstra算法存储到图中每个节点的距离,那么存储到特定节点的距离绝不会少比实际距离。事实上,如果你有非负边缘权重,并在运行Dijkstra算法时查看距离,距离将继续减小和减小,直到它们最终收敛于真实距离。从这个意义上说,Dijkstra的算法不断得到越来越好的真实距离近似值,但是在任何时候都没有距离节点的距离太短。

对于你的第二个问题,我认为作者要求你思考如果你在任何输入图上运行Dijkstra算法会发生什么。随着算法的运行,它不断更新其对图中起始节点和每个其他节点之间距离的猜测。作者说,如果你运行Dijkstra算法并观察它是如何工作的,你会看到的是对一些子程序update的一系列调用,这些调用会改变这些距离。即使算法给出错误的最终答案,它仍然可以通过反复调用update来工作。