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

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值