Bellman-Ford 算法证明

已知有向图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到所有顶点的最短距离

    原文作者:Bellman - ford算法
    原文地址: https://blog.csdn.net/u012413167/article/details/50932949
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞