Floyd 算法

概要

初始状态时候两点的距离:
A [ i ] [ j ] = 0 ( 如 果 i = = j ) A[i][j] = 0 (如果i == j) A[i][j]=0(i==j)
A [ i ] [ j ] = ∞ ( 如 果 i ! = j , 且 无 边 相 连 ) A[i][j] = ∞ (如果 i != j, 且无边相连) A[i][j]=(i!=j,)
A [ i ] [ j ] = W [ i ] [ j ] ( 如 果 i ! = j , 且 有 边 相 连 接 ) A[i][j] = W[i][j] (如果 i != j, 且有边相连接) A[i][j]=W[i][j](i!=j,)
计算最短路径
A − 1 [ i ] [ j ] = g . e d g e s [ i ] [ j ] A_{-1}[i][j] = g.edges[i][j] A1[i][j]=g.edges[i][j]
A k [ i ] [ j ] = M I N ( A k − 1 [ i ] [ j ] , A k − 1 [ i ] [ k ] + A k − 1 [ k ] [ j ] ) , 其 中 0 ⩽ k ⩽ n − 1 A_k[i][j] = MIN{( A_{k-1}[i][j], A_{k-1}[i][k] + A_{k-1}[k][j])}, 其中 0\leqslant k \leqslant n-1 Ak[i][j]=MIN(Ak1[i][j],Ak1[i][k]+Ak1[k][j])0kn1
上面的式子是一个迭代表达式,每迭代依次, i → j i\rightarrow j ij 的最短路径上就多考虑了一个顶点;
经过 n n n 次迭代后得到的 A n − 1 [ i ] [ j ] A_{n-1}[i][j] An1[i][j] 值就是考虑所有顶点后 i → j i \rightarrow j ij 的最短路径,也就是最终解。
另外用二维数组 p a t h path path 保存最短路径,它与当前迭代次数有关。 p a t h k [ i ] [ j ] path_k{[i]}{[j]} pathk[i][j]存放着考察顶点 0 、 1 、 ⋯ 、 k 0、1、\cdots、k 01k 之后得到的 i → j i \rightarrow j ij的最短路径顶点 j j j 的前一个顶点编号,这和 D i j k s t r a Dijkstra Dijkstra 算法采用的方式相似。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
p a t h path path 数组可以推导出所有顶点的最短路径,下面以求 1 → 0 1\rightarrow 0 10 举例说明:
p a t h [ 1 ] [ 0 ] = 2 path[1][0]=2 path[1][0]=2,说明顶点 0 0 0 的前一项顶点是顶点 2 2 2 p a t h [ 1 ] [ 2 ] = 3 path[1][2]=3 path[1][2]=3,表示顶点 2 2 2 的前一个顶点是顶点 3 3 3 p a t h [ 1 ] [ 3 ] = 1 path[1][3] = 1 path[1][3]=1,表示顶点 3 3 3 的前一个顶点是顶点 1 1 1,找到起点。依次得到的顶点序列为: [ 0 , 2 , 3 , 1 ] [0,2,3,1] [0,2,3,1],则 1 → 0 1 \rightarrow 0 10的最短路径为: 1 → 3 → 2 → 0 1\rightarrow3\rightarrow2\rightarrow0 1320

代码

#include "../MatGraph.h"


void Floy(MatGraph g) {
    int A[MAXV][MAXV], path[MAXV][MAXV];
    int i, j, k;
    /// the start of the loop
    for (i = 0; i < g.n; i++) {
        for (j = 0; j < g.n; j++) {
            A[i][j] = g.edges[i][j];
            if (i != j && g.edges[i][j] < INF) {
                path[i][j] = i;     /// 表示顶点 i 到顶点 j 有边时
            } else {
                path[i][j] = -1;   /// 顶点 i 到顶点 j 没有边时
            }
        }
    }
    /// the end of the loof

    for (k = 0; k < g.n; k++) {
        for (i = 0; i < g.n; i++) {
            for (j = 0; j < g.n; j++) {
                if (A[i][j] > A[i][k] + A[k][j]) {
                    A[i][j] = A[i][k] + A[k][j];/// 修改最短路径长度
                    path[i][j] = path[k][j];/// 修改最短路径
                }
            }
        }
    }
}

演示ppt下载

链接:https://pan.baidu.com/s/1v3JPJZyDHG4p0f3ioero7w
提取码:q5f8

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值