代码随想录算法训练营第六十一天 | floyd算法

Floyd 算法精讲

题目链接:97. 小明逛公园

文章讲解:代码随想录

思想:本题是多源最短路,即求多个起点到多个终点的多条最短路径。用Floyd 算法。

Floyd 算法对边的权值正负没有要求,都可以处理,Floyd算法核心思想是动态规划。

动规五部曲:

1、确定dp数组(dp table)以及下标的含义

grid[i][j][k] = m,表示 节点i 到 节点j 以[1...k] 集合中的一个节点为中间节点的最短距离为m。

2、确定递推公式

(1)节点i 到 节点j 的最短路径经过节点k

对于第一种情况,grid[i][j][k] = grid[i][k][k - 1] + grid[k][j][k - 1]

节点i 到 节点k 的最短距离是不经过节点k,中间节点集合为[1...k-1],所以表示为grid[i][k][k - 1]

节点k 到节点j 的最短距离也是不经过节点k,中间节点集合为[1...k-1],所以表示为 grid[k][j][k - 1]

(2)节点i 到 节点j 的最短路径不经过节点k

第二种情况,grid[i][j][k] = grid[i][j][k - 1]

如果节点i 到 节点j的最短距离不经过节点k,那么中间节点集合[1...k-1],表示为 grid[i][j][k - 1]

因为我们是求最短路,对于这两种情况自然是取最小值。

即: grid[i][j][k] = min(grid[i][k][k - 1] + grid[k][j][k - 1], grid[i][j][k - 1])

3、dp数组如何初始化

把k 赋值为 0,本题节点0是无意义的,节点是从1 到 n,在下一轮计算的时候,就可以根据 grid[i][j][0] 来计算 grid[i][j][1],此时的 grid[i][j][1] 就是 节点i 经过节点1 到达 节点j 的最小距离了。

本题求的是最小值,所以输入数据没有涉及到的节点的情况都应该初始为一个最大数

4、确定遍历顺序

好比是一个三维坐标,i和j是平层,而k 是垂直向上的。遍历的顺序是从底向上一层一层去遍历。

所以遍历k 的for循环一定是在最外面,这样才能一层一层去遍历。

5、举例推导dp数组

相关推荐
在黎明的反思13 小时前
进程通信之消息队列(IPC)
算法
老鱼说AI13 小时前
算法基础教学第一步:数据结构
数据结构·python·算法
Jing_Rainbow14 小时前
【LeetCode Hot100 刷题日记(19/100)】54. 螺旋矩阵 —— 数组、矩阵、模拟、双指针、层序遍历🌀
算法·面试·程序员
地平线开发者15 小时前
征程 6 | linear 高精度输出配置方式
算法·自动驾驶
小尧嵌入式15 小时前
C++基础语法总结
开发语言·c++·stm32·单片机·嵌入式硬件·算法
white-persist15 小时前
【攻防世界】reverse | IgniteMe 详细题解 WP
c语言·汇编·数据结构·c++·python·算法·网络安全
稚辉君.MCA_P8_Java15 小时前
Gemini永久会员 归并排序(Merge Sort) 基于分治思想(Divide and Conquer)的高效排序算法
java·linux·算法·spring·排序算法
地平线开发者15 小时前
征程 6 | QAT 新版 qconfig 量化模板使用教程
算法·自动驾驶
多恩Stone15 小时前
【ModelScope-1】数据集稀疏检出(Sparse Checkout)来下载指定目录
人工智能·python·算法·aigc
山峰哥16 小时前
沉浸式翻译插件深度评测:打破语言壁垒的黑科技利器
数据结构·科技·算法·编辑器·办公