几种最短路径算法简介(一)

本文详细介绍了Bellman-Ford算法和Dijkstra算法的执行过程及原理,Bellman-Ford算法能够求解带负权边的图中某一点到其他各点的最短路径,而Dijkstra算法则适用于非负权边的图。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.Bellman-Ford算法:

Bellman-Ford算法基于一个直观上很容易理解的原理:如果节点A的每个相邻节点知道节点Z的最短路径,那么节点A计算经过它的每个相邻节点到节点Z的距离,就能够确定到节点Z的最短路径。


如图,应用Bellman-Ford算法来计算每个节点到节点6的最短路径,以及此最短路径的下一个节点。每个节点维护着一个表项(n,Di),其中n是此最短路径经过的下一个节点,Di是到目的节点的距离。算法执行过程如下:

迭代节点1节点2节点3节点4节点5
初始(-1,∞)(-1,∞)(-1,∞)(-1,∞)(-1,∞)
1(-1,∞)(-1,∞)(6,1)(-1,∞)(6,2)
2(3,3)(5,6)(6,1)(3,3)(6,2)
3(3,3)(4,4)(6,1)(3,3)(6,2)
4(3,3)(4,4)(6,1)(3,3)(6,2)
1)初始时,除了节点6知道到自身的距离为0外,其余节点均不知道下一个节点以及到目的节点6的距离,故初始值均为(-1,∞)。

2)第1次迭代,节点6的相邻节点3和5发现其相邻节点到目的节点6的最短路径,故更新节点3和节点5的表项,其余仍为(-1,∞)。

3)第2次迭代,节点1发现其相邻节点3到目的节点的距离为3,故更新其自身表项为(3,3),注意节点4发现其两个相邻节点都有到目的节点的最短路径信息,经过比较选择经过节点3的路径。其余节点同理检查更新。

4)第3次迭代,节点2发现经过节点4到目的节点的路径更短,故更新其表项,其余节点同理。

5)第4次迭代,没有节点更新,算法结束。

因此我们将Bellman-Ford算法总结如下:

1)初始化:除了目的节点,其余节点表项均为(-1,∞)。

2)检查更新:各节点检查其相邻节点表项,如果经过其相邻节点到目的节点的距离小于其当前表项里的Di,则更新表项。

3)重复步骤2),直至节点表项均不变化。


2.Dijkstra算法:

Dijkstra算法是一种查找从源节点到其它所有节点最短路径的算法。该算法维护一个节点集合N,N由那些已经确定的到源节点最近的节点组成。在每次迭代中,把离源节点最近的节点加入N,并计算通过该节点到其余节点的距离。


我们仍以上图为例看一下Dijkstra算法的执行过程:

迭代ND2D3D4D5D6
初始化{1}325
1 {1,3}3243
2{1,2,3}32473
3{1,2,3,6}32453
4{1,2,3,4,6}32453
5{1,2,3,4,5,6}32353

1)初始化:将源节点1加入集合N,与源节点1相邻的节点初始值为到节点1的距离,其余节点初始值为∞。

2)第1次迭代:检查不在集合N的其余节点到源节点1的最短路径,选择距离最小的那个节点,加入集合N,这里选择节点3。计算通过节点3到源节点的最短路径,若比当前值小,更新最短路径,这里节点4通过节点3到源节点的最短路径为4,你原来小,故更新。同理,节点6也更新。

3)第2次迭代:重复上述过程,这里节点2和节点6到源节点最短距离相等,随机选择一个加入N,这里选择节点2.。更新其余节点。

4)第3次迭代:重复上述过程,将节点6加入N,更新其余节点。

5)第4次迭代:重复上述过程,将节点4加入N,更新其余节点。

6)第5次迭代:将节点5加入集合N,完成算法。

因此,我们将Dijkstra算法总结如下:

1)初始化:将源节点加入集合N,与源节点相邻的节点初始值为到节点的距离,其余节点初始值为∞。

2)检查不在集合N的其余节点到源节点的最短路径,选择距离最小的那个节点,加入集合N,计算其余节点通过该节点到源节点的最短路径,若比当前距离小,则更新。

3)重复步骤2),直至所有节点都在集合N中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值