FC10-Floyd-Warshall 算法:求有向or无向图中所有顶点对之间的最短路径¶
代码实现¶
代码逻辑解析¶
1. Floyd-Warshall 算法基本思想¶
- 通过动态规划求解所有顶点对之间的最短路径
- 核心思想:对于任意三个顶点
s,m,e,如果从s到m再到e的路径比直接从s到e更短,则更新最短路径
2. 关键数据结构¶
- dist[][]:
dist[i][j]表示从顶点i到顶点j的最短路径长度 - path[][]:
path[i][j]表示从顶点i到顶点j的最短路径上,第一个中间顶点的索引;如果为-1,表示直接相连
3. 算法步骤详解¶
步骤1:初始化¶
| C | |
|---|---|
步骤2:动态规划更新¶
| C | |
|---|---|
4. printPath 函数详解¶
- 使用递归方式输出从
u到v的完整路径 - 如果
path[u][v] == -1,表示直接相连,只需输出u - 否则递归输出从
u到path[u][v]和从path[u][v]到v的路径
时间复杂度分析¶
1. 初始化阶段¶
- 两层嵌套循环遍历所有顶点对
- 时间复杂度:O(V²)
2. 动态规划阶段¶
- 三层嵌套循环,每层都遍历所有顶点
- 时间复杂度:O(V³)
3. 总体时间复杂度¶
O(V³),其中 V 是顶点数
空间复杂度分析¶
1. 额外空间使用¶
dist[][]:O(V²)path[][]:O(V²)- 其他局部变量:常量级别
2. 总体空间复杂度¶
O(V²),其中 V 是顶点数
较难理解部分的说明¶
1. path 数组的含义¶
| C | |
|---|---|
2. 图解说明¶
假设无向图如下:
邻接矩阵表示:
Floyd-Warshall 算法执行过程:
最终结果:
| Text Only | |
|---|---|
3. printPath 执行示例¶
| C | |
|---|---|
延伸知识点¶
1. Dijkstra 算法对比¶
| C | |
|---|---|
| 特性 | Floyd-Warshall | Dijkstra |
|---|---|---|
| 目标 | 所有顶点对 | 单源 |
| 时间复杂度 | O(V³) | O(V²) |
| 适用场景 | 稠密图 | 稀疏图 |
| 支持负权边 | 支持 | 不支持 |
2. 优化版本 - 检测负权环¶
| C | |
|---|---|
3. 实际应用场景¶
- 交通导航:城市间最短路径规划
- 网络路由:互联网数据包转发路径选择
- 社交网络:人际关系的最短连接路径
- 生物信息学:蛋白质相互作用网络分析
- 金融系统:货币兑换的最优路径
4. 相关算法扩展¶
| C | |
|---|---|
5. 性能优化建议¶
| C | |
|---|---|
Floyd-Warshall 算法体现了动态规划在图论中的经典应用,通过逐步考虑中间顶点来优化路径,是计算机科学中重要的图算法之一。