Dijkstra算法= SSSP

时间:2016-08-06 06:24:42

标签: algorithm dijkstra

enter image description here

我所学到的,dijkstra无法使用负边缘权重。为此我们必须使用贝尔曼福特。

Bellman fords适用于负边缘权重和负循环,但是无法从源处获得,否则,它将返回msg“存在负循环”。

但是,即使存在负边权重,上面显示的图也适用于dijkstra。那么,如何知道何时使用具有负边权的dijkstra?

有什么想法,dijkstra可以或不能使用负重量边缘。 如果存在负循环,那么它将不起作用。但如果不存在,它可以或不可行。

我是对的? PLZ指导我这个?

3 个答案:

答案 0 :(得分:4)

Dijkstra的算法无法使用负边缘权重。这是因为一旦它将一个节点标记为" visit",它就会假定找到它的最短路径,并且不能改变,在具有负边缘(并且没有负循环)的图形中容易违反不变量:

       A
      / \
    7/   \2
    /     \
   B------>C
      -6

使用Dijkstra算法从A开始寻找最短路径会产生错误的C成本2

您发布的图表也不起作用:考虑从dh的最短路径。此图表上的Dijkstra将为路径(4)生成d->g->h,而0成本的路径更便宜:d->a->b->c->h

答案 1 :(得分:0)

Dijkstra无法使用负负边缘。 有一个名为Johnson的算法,可以“加权”图中的所有边缘,并最终使所有边缘为正。但是该算法称为Bellman ford算法,其时间复杂度为O(V2logV + VE)。 因此,Dijkstra + Johnson的时间复杂度不好。但是,如果可以处理图形,则可以提前使用该算法。 PS:对不起,我的英语不好。

答案 2 :(得分:-1)

你是对的,Dijkstra将负面负重。但是,如果任何周期中的权重总和为负,它将无法工作。