相关笔记
概览
全章围绕所有结点对的最短路径(All-Pairs Shortest Paths, APSP)问题展开。首先建立最短路径与矩阵乘法的联系,利用逐步扩展和重复平方策略得到 的算法(23.1);然后介绍经典的Floyd-Warshall算法,通过动态规划在 时间内求解(23.2);最后针对稀疏图,Johnson算法通过重赋权技术将Bellman-Ford与Dijkstra结合,达到 的时间复杂度(23.3)。全章的核心主线是 如何高效计算所有顶点对之间的最短路径——三种算法分别适用于不同的图密度场景。
知识结构总览
flowchart TD A["第23章 所有结点对的最短路径"] --> B["23.1 矩阵乘法方法"] A --> C["23.2 Floyd-Warshall"] A --> D["23.3 Johnson算法"] B --> B1["逐步扩展 L^(m)"] B --> B2["EXTEND-SHORTEST-PATHS"] B --> B3["SLOW: O(V⁴)"] B --> B4["FAST: O(V³ lg V)"] C --> C1["动态规划 d^(k)"] C --> C2["中间顶点k"] C --> C3["传递闭包"] C --> C4["O(V³)"] D --> D1["重赋权 w'"] D --> D2["Bellman-Ford计算h"] D --> D3["V次Dijkstra"] D --> D4["O(V²lg V + VE)"] B --> C C --> D
核心概念回顾
三种算法对比
| 比较维度 | 矩阵乘法(FAST) | Floyd-Warshall | Johnson |
|---|---|---|---|
| 时间复杂度 | |||
| 适用图 | 一般有向图 | 一般有向图 | 一般有向图 |
| 负权边 | ✅ 支持 | ✅ 支持 | ✅ 支持 |
| 负权环 | 不检测 | ✅ 可检测 | ✅ 可检测 |
| 核心思想 | 重复平方+矩阵乘法 | 动态规划(中间顶点) | 重赋权+V次Dijkstra |
| 稀疏图优势 | — | — | ✅ 显著优于FW |
| 稠密图优势 | — | ✅ 实现简单 | — |
| 空间 |
算法选型指南
根据图密度选择算法
- 稠密图(边数接近 ):Floyd-Warshall,复杂度为 V 的三次方,实现简单
- 稀疏图(边数远小于 ):Johnson,利用 Dijkstra 优势
- 需要传递闭包:Floyd-Warshall 的变体直接计算
核心递推关系
逐步扩展(23.1)
Floyd-Warshall(23.2)
Johnson重赋权(23.3)
,其中
跨章关联
与第22章(单源最短路径)的关系
| 第22章算法 | 第23章应用 |
|---|---|
| Bellman-Ford | Johnson算法第一阶段:计算重赋权函数 |
| Dijkstra | Johnson算法第二阶段:对每个顶点运行Dijkstra |
| 松弛操作 | 所有APSP算法的基础操作 |
与第4章(分治策略)的关系
- 矩阵乘法方法中的重复平方策略本质上是分治思想的应用
- Strassen矩阵乘法可进一步优化矩阵乘法方法的常数因子
- vs (Strassen优化)
与第21章(最小生成树)的关系
- MST的Prim算法与SSSP的Dijkstra算法结构相似(已在第22章讨论)
- APSP问题与MST问题都是图论中的经典”全局”优化问题
综合复习题
复习题 1:Floyd-Warshall算法为什么能在 O(V³) 时间内求解APSP?
Floyd-Warshall的核心递推 的直觉是: 表示从 到 且中间顶点只取自 的最短路径。三重循环( 在最外层)对每个 对尝试所有可能的中间顶点 。每层循环处理 个 对,共 层,因此总复杂度为 。
复习题 2:Johnson算法的重赋权为什么能保持最短路径?
设路径 ,则 。这是一个望远镜求和,中间项全部抵消,最终 。因此,对于固定的起点 和终点 ,所有从 到 的路径在 下的长度都等于在 下的长度加上同一个常数 。这意味着最小化 等价于最小化 。
复习题 3:什么情况下应该选择Johnson而非Floyd-Warshall?
当图是稀疏图()时,Johnson的 优于Floyd-Warshall的 。具体地,当 时,Johnson为 ,而Floyd-Warshall为 。当 时,两者均为 ,但Floyd-Warshall实现更简单,常数因子更小。
复习题 4:传递闭包与最短路径有什么关系?
传递闭包 表示是否存在从 到 的路径(0/1值)。将Floyd-Warshall中的 替换为逻辑或 ,加法替换为逻辑与 ,即可在 时间内计算传递闭包。传递闭包是APSP的”布尔版本”。
常见误区
误区1:Floyd-Warshall只能处理非负权图
正确理解:Floyd-Warshall可以处理负权边(不像Dijkstra)。它还能检测负权环(检查 )。只有当存在负权环时,某些顶点对的最短路径无定义。
误区2:Johnson算法的时间复杂度总是优于Floyd-Warshall
正确理解:仅在稀疏图上Johnson更优。在稠密图()上,两者均为 ,且Floyd-Warshall的常数因子更小。
误区3:矩阵乘法方法比Floyd-Warshall更好
正确理解:FAST-ALL-PAIRS-SHORTEST-PATHS的 比 Floyd-Warshall的 多了一个 因子。矩阵乘法方法的理论价值在于揭示了最短路径与矩阵乘法的联系,以及Strassen优化的可能性,但在实际应用中Floyd-Warshall更常用。
学习要点总结
| 学习目标 | 掌握程度 | 对应笔记 |
|---|---|---|
| 逐步扩展性质与EXTEND操作 | 掌握 | 23.1 最短路径与矩阵乘法 |
| 重复平方策略 | 掌握 | 23.1 最短路径与矩阵乘法 |
| Floyd-Warshall递推与正确性 | 熟练 | 23.2 Floyd-Warshall算法 |
| 传递闭包的计算 | 掌握 | 23.2 Floyd-Warshall算法 |
| Johnson重赋权技术 | 熟练 | 23.3 稀疏图的Johnson算法 |
| Johnson正确性证明 | 掌握 | 23.3 稀疏图的Johnson算法 |
| 三种算法的选型依据 | 熟练 | 全章 |
参见Wiki
概念页尚未创建