已知有向图G(V,E)和权重w(u,v),其中(u,v)∈E,s是源节点
节点v有属性d表示s到v的最短估计距离是d.
Bellman-Ford算法伪代码:
初始化函数
initialize(G,s)
for each vertex v∈G.v
v.d=∞
s.d=0
松弛操作,是最短估计距离不断趋近于最短真实距离:
relax(u,v,w)
if v.d>u.d+w(u,v)
v.d=u.d+w(u,v)
算法实现过程,执|V|-1轮松弛操作,每轮松弛|E|次,时间复杂度为O(|V||E|)。
返回true表示没有负权环路,false表示存在负权环路:
bellman-ford(G,w,s)
for i=1 to |G.V|-1
for each edge(u,v)∈G.E
relax(u,v,w)
for each edge(u,v)∈G.E
if v.d>u.d+w(u,v)
return false
return true
算法正确性证明:
假设s到v的最短真实距离是v.r
有如下引理:
假入s->vk的最短路径为p=<v0,v1,v2,…vk>,并且我们队p中的边所进行的松弛顺序为(v0,v1),(v1,v2),…,(Vk-1,Vk),则vk.d=v.r。该性质的成立与其他任何松弛操作无关,即使这些松弛操作是与对p上的边所进行的松弛操作穿插进行的。
有了以上引理,第i轮循环就可以看做是对(vi-1,vi)进行松弛。所以经过|V|-1轮后,对于所有v∈V,都有v.d=v.r
所以可以得到s到所有顶点的最短距离