前序
Floyd:求出每一对顶点之间的最短路径
使用动态规划思想,将问题的求解分为多个阶段
对于 n 个顶点的图 G,求任意一对顶点
V
i
V_i
Vi➡️
V
j
V_j
Vj之间的最短路径可分为如下几个阶段: ^dc1a52
- 初始:不允许在其他顶点中转,最短路径是?
- 0:若允许在 V 0 V_0 V0中转,最短路径是?
- 1:若允许在 V 1 V_1 V1中转,最短路径是?
- …
- n-1:若允许在 V 0 V_0 V0, V 2 V_2 V2,…, V n − 1 V_{n-1} Vn−1中转,最短路径是?
Floyd 算法
算法思想:
if(A[i][j]>A[i][k]+A[k][j]){
A[i][j]=A[i][k]+A[k][j];
path[i][j]=k
}else{
continue;
}
注意
Floyd 算法不能解决带有“负权回路”的图 (带负权值的边组成回路),这种图有可能没有最短路径
知识回顾
- 所有算法 (最短路径-BFS算法)、最短路径-Dijkstra算法、最短路径-Floyd算法 都不可以解决带负权回路的图。
- BFS 不适合用来解决带权图问题
- 注意每个算法间的特性和适用场景
- 也可⽤ Dijkstra 算法求所有顶点间的最短路径,重复
∣
V
∣
|V|
∣V∣ 次即可,总的时间复杂度也是
O
(
∣
V
∣
3
)
O(|V|^3)
O(∣V∣3)