最短路径问题

最短路径问题

介绍Floyd算法

算法描述

Floyd算法又称为插点法,是一种利用动态规划的思想寻找给定加权图中多源点之间最短路径的算法,与Dijkstra算法类似。该算法名称以创始人之一、1978年图灵奖获得者、计算机科学系教授罗伯特 弗洛伊德命名

具体的算法思想为:

  1. 首先,要构造一个邻接矩阵(二维数组)dist点与点之间的路径距离,这个邻接矩阵要初始化,在初始化时有两点需要注意,第一:自己与自己之间的距离为0,第二:如果刚开始没有直接相连的两点那么就默认为一个很大的值(不要因为计算溢出成负数)
dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j])
  1. 然后就是不断执行上面给的一行代码,更新dist,现在解释一下这一行代码
    在这里插入图片描述

上面这张图很容易看出来:AC>AB+BC,用代码语言描述就是:

dp[A][C]=min(dp[A][C],dp[A][B]+dp[B][C])

这里面B点的寻找过程就是一层循环,遍历所有的点,直到找到A→C的最短路径(这里的最短路径只能在A→C或A→一个中转点→C中寻找)

  1. 最后dist里面存的就都是每个点到每个点之间的最短距离了

现在我们图解一个案例
在这里插入图片描述

想要找到A→D之间的最短距离:

遍历到B节点:AB+BD=7<AD,所以dp[A][D]从原来的8更新为了7

遍历到C节点:AC+CD=6<AD,所以dp[A][D]又从刚更新的7更新为了6

此时A→D之间的最短距离为AC+CD,

但是现在AC和CD之间的距离还只是刚开始初始化的距离,还没有更新

现在我们找A→C和C→D之间的最短距离,和找A→D之间最短距离的原理相同(不断地找中间节点)

经过寻找:A→C之间的最短距离为A→B→C=3,C→D之间的最短距离为C→D=2

下面再寻找A→B和B→C之间的最短距离,显然就是图中的1和2

终上:A→D之间的最短距离为AB+BC+CD=5

程序代码

在这里插入图片描述

重点是理解三层循环:外面两层循环是遍历arr这个邻接矩阵,第三层循环是用来找两点之间的最短距离

小试牛刀

💯自己会没会?刷一道题就可以知道了

蓝桥杯最短路径问题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黎耀明

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值