单源最短路径
定义
单源最短路径(Single Source Shortest Path):对于一个带权图
路径长度指的是路径上各边权之和
常见解决单源最短路径问题的算法包括:
1、Dijkstra算法:一种贪心算法,用于解决无负权边的情况。它逐步扩展当前已知最短路径的范围,选择当前距离起始节点最近的节点,并更新该节点相邻的节点的距离
2、Bellman-Ford算法:适用于有负权边的情况。它通过多次迭代来逐步逼近最短路径,每次迭代都尝试通过更新边的权重来缩短路径。
3、SPFA 算法:优化的 Bellman-Ford 算法,它在每次迭代中不遍历所有的边,而是选择性地更新与当前节点相关的边,从而提高了算法的效率。
Dijkstra算法
在有权图(权值非负数)中求从起点到其他节点的最短路径算法
1、选源点到哪个节点近且该节点未被访问过
2、该最近节点被标记访问过
3、更新非访问节点到源点的距离,即更新minDist数组
朴素Dijkstra
堆优化版Dijkstra
朴素版本是通过遍历节点来遍历边,通过两层for循环来寻找距离最近节点。这次直接遍历边,且通过堆来堆边进行排序,达到直接选择距离源点最近节点
Bellman-Ford算法
带负权值的单源最短路问题
核心思想是对所有边进行松弛n-1次操作(n为节点数量),从而求得目标最短路
minDist[B] = min(minDist[A] + value, minDist[B])
Bellman-ford算法采用了动态规划的思想,即:将一个问题分解成多个决策阶段,通过状态之间的递归关系最后计算出全局最优解
SPFA 算法
Bellman-ford算法每次松弛都是对所有边进行松弛
但真正有效的松弛,是基于已经计算过的节点在做的松弛
所以 Bellman_ford 算法 每次都是对所有边进行松弛,其实是多做了一些无用功。
只需要对 上一次松弛的时候更新过的节点作为出发节点所连接的边 进行松弛就够了。