最短路径算法(二):Bellman-Ford算法

一、算法介绍


 

Dijkstra算法不能适用有负权边的情况

1、单源 求某个节点到其他所有节点的最短距离

2、适用有负权边的情况

3、动态规划思想

     对经历的边数进行迭代计算(n个节点最多经历n-1次计算,超过n-1次则说明有负权环存在)

     第一次迭代 ,从源点出发经历一条边所能达到的最短距离

     第二次迭代,从源点出发经历2条边所能达到的最短距离

    。。。。。

 

二、算法思想


 

(1)初始化:将除起点s外所有顶点的距离数组置无穷大 d[v] = INF, d[s] = 0
(2)迭代:对经历的边数进行迭代,更新最短距离,把下一次的点放入队列Q,下次迭代从Q中取节点
(3)判断负圈:如果迭代超过V-1次,则存在负圈

我们用距离数组d[i]来记录起点A到点i的最短距离。

 

松弛: 经历一条边AB到达B时,此时d(B) > d(A) + AB的距离

            即经历一条边到达某个点时,距离变小,则为松弛操作。

 

 

 

源点A

第1次迭代:

可经历的边AB AC,把B C放入队列Q

d(A)=0,d(B)=1,d(C)=2,d(D)=INF,d(E)=INF,d(F)=INF

(经历1条边达到各个节点的最短距离

 

第2次迭代:

从Q中取出B C

可经历的边:BD CE ,把D E放入Q

d(A)=0,d(B)=1,d(C)=2,d(D)=3,d(E)=3,d(F)=INF

 (经历2条边达到各个节点的最短距离

 

第3次迭代:

从Q中取出 D E

可经历的边:DF ED EF, 把D F放入Q

到达D的距离变小,更新

d(A)=0,d(B)=1,d(C)=2,d(D)=2,d(E)=3,d(F)=4

  (经历3条边达到各个节点的最短距离

 

第4次迭代:

从Q中取出D F

可经历的边DF ,把F放入Q中

最短距离无变化

d(A)=0,d(B)=1,d(C)=2,d(D)=2,d(E)=3,d(F)=4

  (经历4条边达到各个节点的最短距离

 

第5次迭代:

从Q中取出F,

没有可经历的边了 迭代结束!

最短距离就是: d(A)=0,d(B)=1,d(C)=2,d(D)=2,d(E)=3,d(F)=4

  (经历5条边达到各个节点的最短距离

 

 

 


 

posted @ 2020-05-31 18:00  蓝天随笔  阅读(368)  评论(2编辑  收藏  举报