彻底弄懂最短路径问题.pdfVIP

  • 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)

1亿VIP精品文档

相关文档