Shortest Path Problem
迪杰斯特拉
- 开一个dis数组,记录从给定点x到其他点的最短距离,初始化为max,;开一个visited数组,记录顶点是否被访问过
- 将x的dis初始为0
- 开始遍历,首先找到未被访问且距离x最短的顶点y,将y的visited赋值true
- 更新的dis中顶点z的距离:未被访问且
z与x的距离大于x到y + y到z的距离
743. 网络延迟时间
方法一:迪杰斯特拉
1 | |

方法二:堆优化dijkstra
我们还可以使用一个小根堆来寻找「未确定节点」中与起点距离最近的点
1 | |
322. 零钱兑换


方法一:BFS
1 | |
45. 跳跃游戏 II

方法一:BFS
1 | |

方法一:BFS
- queue三元组,分别为横坐标i,纵坐标j,mat[i][j]距离0的距离
- 将所有0加入队列,并标记visited
- BFS搜索
1 | |


1334. 阈值距离内邻居最少的城市

不能用BFS做,这是求多源最短路径
方法一:弗洛伊德
- dp[i][j]表示i到j的最短距离
- 枚举所有中间节点k,如果i经过中间节点k再到达j比i直接到达j更短,那么将dp[i][j]赋值为dp[i][k] + dp[k][j]
1 | |

剑指 Offer II 107. 矩阵中的距离

方法一:BFS
BFS可以确保从0到非0元素的最短路径
1 | |
剑指 Offer II 108. 单词演变

方法一:单向BFS
不能使用queue2.clear(),因为queue1是指向queue2内存空间的
1 | |
代码
1 | |
方法二:双向BFS
1 | |
剑指 Offer II 109. 开密码锁
方法一:单向BFS
1 | |
6951. 找出最安全路径

方法一:多源BFS
二分做右端点的初始
1 | |
1 | |
在check中判断初始位置,r = 2 * n - 1 (大一点也没关系)
1 | |
代码
1 | |
check使用DFS
1 | |
int[][] visited数组,visited数组只需要创建一次
要初始化为-1,因为会考虑到limit == 0的情况
1 | |
方法二:多源BFS + 并查集

关于从dists.size() - 2开始枚举:最后一步是空集,所以最大的距离为 dists.size() - 2

1 | |
补充题 1631. 最小体力消耗路径

方法一:多源BFS + 二分
1 | |
方法二:并查集

1 | |
在网格图中访问一个格子的最少时间

二刷 dijkstra
无需visited数组
1 | |
方法一:堆优化的dijkstra
dist[i][j]与 i + j 同奇偶
1 | |
方法二:二分+ BFS
双数组
1 | |
Queue
q.offer(new int[]{m - 1, n - 1, limit - 1});表示终点在limit时访问过,邻居的grid值要小于limit - 1
从limit - 1开始
1 | |
单源最短路
743. 网络延迟时间

方法一:Dijkstra
1 | |
方法一:Dijkstra
1 | |
1631. 最小体力消耗路径

方法一:二分 + DFS
1 | |
1368. 使网格图至少有一条有效路径的最小代价

方法一:Dijkstra
1 | |
全源最短路
Shortest Path Problem
https://leopol1d.github.io/2023/05/31/shortest-path-problem/