最短路径算法(二):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条边达到各个节点的最短距离)