章节摘要:地图上的每条道路如今都有了里程——通行要付出代价,远征队的问题从"能不能到"升级为"怎么到最省"。本章是全册的第一场大型战役:Dijkstra 用贪心策略在非负权地形上闪电推进;Bellman-Ford 牺牲速度换取稳健,独门解负权边并顺手侦测负环;Floyd-Warshall 换一个视角,在邻接矩阵上三重循环算出所有顶点对之间的最短路。三支部队各擅胜场,也各有禁区。学完本章,你面对任何"求最短"的问题,应当能先问对三个问题:权有没有负的?要一个源还是全部源?稀疏还是稠密?
下列考核点覆盖本章全部内容:
金句:最短路算法的分歧不在"怎么走",而在"敢不敢相信眼前这条最近的边"——贪心的胆量由权非负担保。
第 1 节"Dijkstra 算法:非负地形上的贪心行军"从行军竞赛的场景切入,完整推演贪心策略为何在非负权下无懈可击,给出朴素与堆优化两种实现,并交代它作为导航系统心脏的工程变体。
第 2 节"Bellman-Ford 与负权地形:反复松弛的稳健打法"处理贪心的禁区:负权边。反复松弛的稳健打法以更多轮次为代价换正确性,还附赠负环侦测——汇率套利检测正用它。
第 3 节"Floyd-Warshall:全源最短路的方阵演算"把镜头拉远:不求单源,一次算清所有顶点对。矩阵视角与第 2 章的邻接矩阵呼应,三重循环的次序里藏着动态规划的骨架。
一句话论点:问对问题再选兵器——权的符号定生死,源的数量定格局,图的疏密定实现。
求最短路之前,先过三道关卡 ┌─ 关卡一:有负权边? ─── 有 → Bellman-Ford(再查负环) │ 无 → Dijkstra 或 Floyd ├─ 关卡二:单源还是全源? ─ 单源 → Dijkstra(堆优化) │ 全源 → Floyd(或逐点跑单源) └─ 关卡三:疏还是密? ──── 稀疏 → 邻接表+堆 稠密 → 朴素 Dijkstra / Floyd
前置:第 2 章的邻接矩阵与邻接表(两种存储在这里直接决定实现路线)、第 3 章广度优先的"层次即距离"(Dijkstra 是它的加权推广)、优先队列的基本用法。
后续延伸:最短路是无数系统的地基——第 10 章的路由与导航一节将检验它的工程形态;稀疏图上的全源问题可以逐顶点跑单源替代 Floyd;Floyd 的三重循环是第 6 章动态规划式思维的预热。此外,"松弛"这一操作将贯穿全册,网络流一节还会再见到它的变体。