Floyd 算法介绍

一 背景介绍

如果求解任意两个节点之间的最短路径,则需要以每个节点为源点,重复调用 n 次 DijKstra 算法。其实是完全没有必要这么麻烦,Floyd 算法可用于求解任意两个节点之间的最短距离。Floyd 算法又被称为插点法,其核心思想是在节点 i 与 j 之间插入节点 k,看看是否可以缩短节点 i 和 j 之间的距离。

二 算法步骤

1 数据结构

设置地图带权邻接矩阵为 G.Ege[][],即如果从节点 i 到节点 j 有边,则 G.Ege[i][j]=<i,j>的权值,否则 G.Ege[i][j]=无穷大;采用两个辅助数组:最短距离数组dist[i][j],记录从节点 i 到节点 j 的最短路径长度;前驱数组 p[i][j],记录从节点 i 到节点 j 的最短路径商节点 j 的前驱。

2 初始化

初始化 dist[i][j]=G.Ege[i][j],如果从节点 i 到节点 j 有边相连,则初始化 p[i][j]=i,否则 p[i][j]=-1。

3 插点

在节点 i 和 j 之间插入节点 k,看是否可以缩短节点 i、j 之间的距离。如果 dist[i][j] > dist[i][k] + dist[k][j],则 dist[i][j] = dist[i][k] + dist[k][j],记录节点 j 的前驱 p[i][j]=p[k][j]。

三 图解

最初的地图如下:

1 数据结构

最初 G.Ege[i][j] 的权值如下

2 初始化

初始化最短距离数组为 G.Ege[i][j],如果从节点 i 到节点 j 有边相连,则初始化前驱数组 p[i][j]=i,否则 p[i][j]=-1。初始化 dist[][] 和 p[][],如下图所示。

3 针对 k=0 进行插点

插入后的路径可能有 2 条。

2 0 1

2 0 3

插入后 dist[][] 和 p[][],如下图所示。

4 针对 k=1 进行插点

插入后的路径可能有有 4 条。

0 1 2

0 1 3

2 1 0

2 1 3

插入后 dist[][] 和 p[][],如下图所示。

5 针对 k=2 进行插点

插入后的路径可能有 6 条。

1 2 0

1 2 3

3 2 0

3 2 1

插入后 dist[][] 和 p[][],如下图所示。

6 针对 k=3 进行插点

0 3 1

0 3 2

1 3 0

1 3 2

2 3 0

2 3 1

插入后 dist[][] 和 p[][],如下图所示。

7 插点结束

dist[][] 包含了各个节点之间的最短距离。可从 p[][] 推测出各个节点的最短路径。 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值