从Bellman-Ford算法开始

写在前面

首先这是我的学习记录,尽量写得通俗易懂,但囿于水平有限质量无法保证。
这篇的知识背景是基于松弛技术,至于什么是松弛技术可以看这一篇

Bellman-Ford的逻辑

BELLMAN-FORD(G,w,s)
1 INITIALIZE-SINGLE-SOURSE(G,s)
2 for i<--1 to |V[G]|-1
3	do for each edge(u,v)∈E[G]
4		do RELAX(u,v,w)
5 for each edge(u,v)∈E[G]
6	do if d[v]>d[u]+w(u,v)
7		then return FALSE
8 return TRUE

伪代码清晰明了,但是还是应该做一些解释
第一行,在松弛技术中是初始化,每一个应用松弛技术的代码都要先初始化。
二到四行,是调整最短路径。
五到七行是做检测看看有没有负回路。

Bellman-Ford为什么是有用的

所凭借的依据


引理24.15 路径松弛性质
如果p=<v0,v1,……,vk>是从s=v0到vk的最短路径,而且p的边按照(v0,v1)(v1,v2),……,(vk-1,vk)的顺序进行松弛,那么d[vk]=m(s,vk)。这个性质的保持并不受其他松弛操作的影响,即使他们与p边上的松弛操作混在一起也是一样的。


上面的引理告诉我们,我们的算法的中心任务就是按照顺序去松弛,这是重点。

Bellman-Ford怎么达到这一点的

这里我将举个例子,假设最短路径的节点为序列p,p=<s,v1,v2,v3,v4,…,vk-1,vk>(0<=k<=n-1)(n为节点数)。
首先忽略循环次数仅仅考虑如下的代码。

for each edge(u,v)∈E[G]
	  do RELAX(u,v,w)

在这里插入图片描述
用算法导论的图做演示。
第一次循环(a—>b)因为只有初始节点s的d[s]=0,所以只会松弛t和y,即s可以到达的节点,这两个点一定有一个点是v1,我们完成了第一条边s—>v1的处理,获得了m(s,v1)。
第二次循环,做一次完整代码加入了两个新的节点而且也对之前的节点做了松弛。最重要的就是我们找到了v2,v2一定是x,z其中之一,换言之我们找到了m(v1,v2)。
循环之内的作用现在大概搞清了,即按照顺序寻找最短路劲。但是我们要循环几遍呢,考虑到一条最短路径最多包含全部节点,所以最多会有n-1条路径组成,每次找一条所以n-1次就够了

关于检测

其实从逻辑上可以接受,就是不知道严谨不严谨。关于为什么是对的,算法导论上有反证法直接去看就好。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值