(1)floyd算法求最小环(无向图)
设一个环中的最大结点编号为k,与它相连的两个点为i, j,则这个环的最短长度为g[i][k] + g[k][j] + dist[i][j](最短距离)
根据floyd算法原理,在最外层做了k - 1次后,dist[i][j]代表了i到j的路径中,所有结点的编号都小于k的最短路径
代码:FORE(k, 1, N) {
FOR(i, 1, k) FOR(j, i + 1, k)
if(answer > g[k][i] + g[k][j] + dist[i][j])
answer = g[k][i] + g[k][j] + dist[i][j];
FORE(i, 1, N) FORE(j, 1, N)
dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]);
}
(2)floyd算法求最短路
该算法是基于动态规划的原理实现的令状态dp(i, j, k)表示从i到j的最短路径长度,其中k表示路径中的最大可能顶点(不包含i,j)
对于状态dp(i, j, k),可以考虑顶点k,如果顶点k不在该路径中,则该路径长度为dp(i, j, k - 1),如果k在该路径中,则该路径长度为dp(i, k, k - 1) + dp(k, j, k - 1)
所以状态转移方程为:dp(i, j, k) = min(dp(i, j, k - 1), dp(i, k, k - 1) + dp(k, j, k - 1))对于初始状态:dp(i, j, 0) = g[i][j]