我所学到的,dijkstra无法使用负边缘权重。为此我们必须使用贝尔曼福特。
Bellman fords适用于负边缘权重和负循环,但是无法从源处获得,否则,它将返回msg“存在负循环”。
但是,即使存在负边权重,上面显示的图也适用于dijkstra。那么,如何知道何时使用具有负边权的dijkstra?
有什么想法,dijkstra可以或不能使用负重量边缘。 如果存在负循环,那么它将不起作用。但如果不存在,它可以或不可行。
我是对的? PLZ指导我这个?
答案 0 :(得分:4)
Dijkstra的算法无法使用负边缘权重。这是因为一旦它将一个节点标记为" visit",它就会假定找到它的最短路径,并且不能改变,在具有负边缘(并且没有负循环)的图形中容易违反不变量:
A
/ \
7/ \2
/ \
B------>C
-6
使用Dijkstra算法从A开始寻找最短路径会产生错误的C成本2
。
您发布的图表也不起作用:考虑从d
到h
的最短路径。此图表上的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将负面负重。但是,如果任何周期中的权重总和为负,它将无法工作。