Floyd-Warshall(弗洛伊德)算法考研笔记
Floyd-Warshall(弗洛伊德)算法 考研笔记
一、算法概述
1.1 核心思想
Floyd算法是一种多源最短路径算法,基于动态规划思想,用于求解图中任意两个顶点之间的最短路径。
核心原理: 通过逐次引入每个顶点 k 作为”中间节点”,不断更新所有顶点对 (i, j) 之间的最短路径长度。
状态转移:
- 初始状态 D⁰: 只允许直接路径(邻接矩阵)
- 第k次迭代 Dᵏ: D$i$$j$ 表示从 i 到 j 只允许经过集合 {1, 2, …, k} 中的顶点作为中间节点的最短路径长度
- 最终状态 Dⁿ: 任意两点间的最短路径值
1.2 算法特点
| 特性 | 描述 |
|---|---|
| 算法类型 | 多源最短路径,动态规划 |
| 时间复杂度 | O(V³),三层循环 |
| 空间复杂度 | O(V²),需存储距离矩阵和路径矩阵 |
| 适用图 | 有向图、无向图均可 |
| 权值限制 | 可处理负权边,但不能处理负权环 |
| 优点 | 代码简洁,一次运行得到所有顶点对最短路径 |
| 缺点 | 时间复杂度高,不适合顶点数很多的图 |
二、算法步骤详解
2.1 第一步:初始化邻接矩阵
核心公式:
1 | |
迭代规则(第k次迭代)
(1)照抄部分
- 主对角线第k行整行照抄
- 主对角线第k列整列照抄
- 该行列中为∞的元素,其对应的行和列也照抄
- 主对角线元素(0)始终不变
(2)更新部分
对于其他位置的元素 (i, j):
- 比较: 原值 vs (i到k的距离 + k到j的距离)
- 更新规则: 取较小值
- 角标更新: 若更新,则合并路径角标
三、考研重点总结
3.1 必背核心
- 核心公式: $D{ij} = \min(D{ij},\ D{ik} + D{kj})$
- 时间复杂度: O(V³)
- 迭代顺序: k 循环在最外层(逐步引入中间点)
- 负权处理: 可处理负权边,不能处理负权环
3.2 与其他算法对比
| 特性 | Floyd | Dijkstra | Bellman-Ford |
|---|---|---|---|
| 路径类型 | 多源 | 单源 | 单源 |
| 时间复杂度 | O(V³) | O(V²) 或 O(ElogV) | O(VE) |
| 负权边 | ✓ | ✗ | ✓ |
| 负权环 | ✗ | ✗ | 可检测 |
| 实现难度 | 简单 | 中等 | 中等 |
| 适用场景 | 稠密图小规模 | 无负权单源 | 有负权单源 |
3.3 手算技巧
- 严格按照迭代规则:先照抄,后更新
- 遇到∞跳过计算
- 角标记录完整路径(便于验证)
- 对角线始终为0
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Moyuan"s website!
