求一个点到其他点的最短路径
1. Bellman-Ford 算法
需要条件:
- 没有负根,即点到点之间的距离不会出现负数的情况,这种情况会造成死循环
- 可以有环,即几个点之间可以连成环
思路:
- 一直循环,知道每个点都是最佳的点
- 每次循环时都要遍历已知的边一次,判断用上这条边能否使点更近
- 当循环一遍后都没有使点更近的边,则结束循环
模板:
|
|
- 时间复杂度:O(n2)
- 空间复杂度:O(n)
2. Dijkstra 算法
需要条件:
- 没有负根
- 可以有环
思路:
- 若已知一个点的最短距离后,将与其向临近的点以及到点的距离放到最小堆里
- 每次都是从最小堆中取点
- 同时设置一个 visited 数组,查看是否已经使用过
模板:
|
|
- 时间复杂度:O(nlog(n))
- 空间复杂度:O(n)
所有点到所有点之间的最短距离
Floyd 算法
需要条件:
- 可以为负根
- 可以有环
思路:动态规划
- dp[i][j] = min(d[i][j], d[i][k] + dp[k][j])
- d[i][k] + dp[k][j] 表示从 i 经过点 k 到 j 的距离
模板:
|
|