- Floyd 求最短路,时间复杂度 O ( n 3 ) O(n^3) O(n3),空间复杂度 O ( n 2 ) O(n^2) O(n2)。
for (int k = 1;k <= n;++k)
for (int i = 1;i <= n;++i)
for (int j = 1;j <= n;++j) dis[i][j] = min (dis[i][j],dis[i][k] + dis[k][j]);
- 【Q1】该算法的正确性?
算法基于动态规划。设 f k , i , j f_{k,i,j} fk,i,j 表示只能借助于 1 , 2 , ⋯ , k 1,2,\cdots,k 1,2,⋯,k 点时, i → j i \to j i→j 的最短路径。那么根据是否经过 k k k 点,可以列出状态转移方程:
f k , i , j = min ( f k − 1 , i , j , f k − 1 , i , k + f k − 1 , k , j ) f_{k,i,j} = \min (f_{k - 1,i,j},f_{k - 1,i,k} + f_{k - 1,k,j}) fk,i,j=min(fk−1,i,j,fk−1,i,k+fk−1,k,j)
很好理解,后者相当于以 k k k 作为中转站,即 i → k → j i \to k \to j i→k→j 的转移。那么当处理询问 u , v u,v u,v 时, f n , u , v f_{n,u,v}