- 2
- 0
- 约1.55万字
- 约 29页
- 2021-09-23 发布于重庆
- 举报
彻底弄懂最短路径问题
———————————————————————————————— 作者 :
———————————————————————————————— 日期:
彻底弄懂最短路径问题
只想说 :温故而知新 ,可以为师矣。我
大二的《数据结构》是由申老师讲的 ,那
时候不怎么明白 ,估计太理论化了 ( ps:
或许是因为我睡觉了 );今天把老王的
2011年课件又看了一遍 ,给大二的孩子们
又讲了一遍 ,随手谷歌了 N 多资料,算是
彻底搞懂了最短路径问题。请读者尽情
享用……
我坚信 :没有不好的学生, 只有垃圾
的教育。不过没有人理所当然的对你好,
所以要学会感恩。
一 .问题引入
问题:从某顶点出发 ,沿图的边到达
另一顶点所经过的路径中,各边上权值
之和最小的一条路径——最短路径。解
决最短路的问题有以下算法, D ijkstra
算法,Bellman-Ford 算法 , Fl oyd 算法和
SPFA算法,另外还有著名的 启发式搜
索算法 A* ,不过A *准备单独出一篇, 其
中 Floyd 算法可以求解任意两点间的最
短路径的长度。笔者认为任意一个最短
路算法都是基于这样一个事实:从任意
节点A到任意节点 B 的最短路径不外乎
2 种可能, 1 是直接从A到B , 2是从 A
经过若干个节点到 B。
二 .Dijk str a算法
该算法在《数据结构》课本里是以
贪心的形式讲解的 ,不过在《运筹学》教
材里被编排在动态规划章节 ,建议读者两
篇都看看。
观察右边表格发现除最后一个节点
外其他均已经求出最短路径。
(1) 迪杰斯特拉(D i jkstra)算
法按路径长度(看下面表格的最后一行 ,
就是 next 点)递增次序产生最短路径。 先
把V分成两组:
? S:已求出最短路径的顶点的集合
? V-S=T: 尚未确定最短路径的顶点集
合
将 T 中顶点按最短路径递增的次序
加入到S中,依据 :可以证明 V0 到 T 中
顶点 Vk 的最短路径 ,或是从 V0 到 Vk 的
直接路径的权值或是从 V 0经 S 中顶点
到 Vk 的路径权值之和 (反证法可证,说
实话,真不明白哦 )。
(2) 求最短路径步骤
1. 初使时令 S= {V0},T= {其余顶点} ,
T 中顶点对应的距离值 , 若存在 V0 ,
Vi>,为<V0,V i 弧上的权值(和 S
PFA 初始化方式不同 ),若不存在
V0,Vi ,为 Inf 。
2. 从 T 中选取一个其距离值为最小的
顶点 W(贪心体现在此处 ),加入 S(注意
不是直接从 S 集合中选取, 理解这个
对于理解 vis 数组的作用至关重要 ),
对 T 中顶点的距离值进行修改 :若加
进W作中间顶点 ,从V 0 到 Vi 的距离
值比不加 W 的路径要短,则修改此
距离值 (上面两个并列 f or循环,使
用最小点更新)。
3. 重复上述步骤, 直到S中包含所有顶
原创力文档

文档评论(0)