解决的问题
多源最短路问题,可以求出所有点到所有其他点的最短路,时间复杂度为 O ( n 3 ) O(n^3) O(n3),可以有负权,不能有负环。
思想
模版这么简单,直接记模版吧
主要是运用动态规划思想,转移方程为
g
[
k
]
[
i
]
[
j
]
=
m
i
n
(
g
[
k
−
1
]
[
i
]
[
j
]
,
g
[
k
−
1
]
[
i
]
[
k
]
+
g
[
k
−
1
]
[
k
]
[
j
]
)
g[k][i][j] = min(g[k-1][i][j] , g[k-1][i][k]+g[k-1][k][j])
g[k][i][j]=min(g[k−1][i][j],g[k−1][i][k]+g[k−1][k][j])
g[k][i][j]的含义是只用前面k个点进行最短路连接,那么可以将该状态划分为用第k进行转移以及不用第k个进行转移两种状态,求个最小值即可,可以用滚动数组优化方式优化掉第一维。
如果想深入理解思想,建议写一写洛谷P1119
https://www.luogu.com.cn/problem/P1119
写完之后就能更好的理解了
模版
//g为邻接矩阵,经过floyd算法后变成就是点到点的最短路
int floyd(){
for (int k = 1; k <= n; k ++)
for (int i = 1; i <= n; i ++)
for (int j = 1; j <= n; j ++)
g[i][j] = min(g[i][j], g[i][k] + g[k][j]);
}