最短路径问题
介绍Floyd算法
算法描述
Floyd算法又称为插点法,是一种利用动态规划的思想寻找给定加权图中多源点之间最短路径的算法,与Dijkstra算法类似。该算法名称以创始人之一、1978年图灵奖获得者、计算机科学系教授罗伯特 弗洛伊德命名
具体的算法思想为:
- 首先,要构造一个邻接矩阵(二维数组)dist点与点之间的路径距离,这个邻接矩阵要初始化,在初始化时有两点需要注意,第一:自己与自己之间的距离为0,第二:如果刚开始没有直接相连的两点那么就默认为一个很大的值(不要因为计算溢出成负数)
dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j])
- 然后就是不断执行上面给的一行代码,更新dist,现在解释一下这一行代码
上面这张图很容易看出来:AC>AB+BC,用代码语言描述就是:
dp[A][C]=min(dp[A][C],dp[A][B]+dp[B][C])
这里面B点的寻找过程就是一层循环,遍历所有的点,直到找到A→C的最短路径(这里的最短路径只能在A→C或A→一个中转点→C中寻找)
- 最后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这个邻接矩阵,第三层循环是用来找两点之间的最短距离
小试牛刀
💯自己会没会?刷一道题就可以知道了