遍历所有点的最短路径matlab_号称最贪心的算法Dijkstra算法

66e737571f376cd438b5e2d9e380319b.gif

Dijkstra算法算是贪心思想实现的,首先把起点到所有点的距离存下来找个最短的,然后松弛一次再找出最短的,所谓的松弛操作就是,遍历一遍看通过刚刚找到的距离最短的点作为中转站会不会更近,如果更近了就更新距离,这样把所有的点找遍之后就存下了起点到其他所有点的最短距离。

问题引入:

指定一个点(源点)到其余各个顶点的最短路径,也叫做“单源最短路径”。例如求下图中的1号顶点到2、3、4、5、6号顶点的最短路径。

62745b954c473a770c535ffb0f6694b0.png

fd7593aa7572ed82de3b42aef5e8f4b5.png

a94bced633731c299e178234db168964.png

b70f12844d86e8bdc1c8d954206f6587.png

2ac0e35bf1f907926f9bd83ee35a5e2b.png

ecbfcbc9053c3e6fa9c6fb760ff5ddc5.png

108850282678a6d3e04bb5041513ed76.png

c9fbc27267d40a7444223c87d3e99488.png

下面我们来模拟一下:

2ac0e35bf1f907926f9bd83ee35a5e2b.png

6e82975c17a24edf20c12a87cebd9b29.png

Dijkstra算法具体步骤为:

(1)初始时,S只包含源点,即S=,v的距离为0。U包含除v外的其他顶点,U中顶点u距离为边上的权(若v与u有边)或 )(若u不是v的出边邻接点)。

(2)从U中选取一个距离v最小的顶点k,把k,加入S中(该选定的距离就是v到k的最短路径长度)。

(3)以k为新考虑的中间点,修改U中各顶点的距离;若从源点v到顶点u(u U)的距离(经过顶点k)比原来距离(不经过顶点k)短,则修改顶点u的距离值,修改后的距离值的顶点k的距离加上边上的权。

(4)重复步骤(2)和(3)直到所有顶点都包含在S中。

509323d795ca78a4473ff76383487435.gif

接下来是代码:

已经把几个过程都封装成了基本模块:

9e200c519f1153daf13e48c752a81609.png

9ecd9615344f7eb6c4d59c8a23eae4c3.png

176856336b8f4678c010add7da1b7e31.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值