floyd算法求最小环

来源:互联网 发布:益友电台第一台网络 编辑:程序博客网 时间:2024/05/21 08:03

(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]

原创粉丝点击