algorithm-SPFA
SPFA算法
概念
SPFA算法是一种基于Bellman-Ford算法的改进版本,它用于计算图中各节点到源节点的最短路径。与Bellman-Ford算法不同的是,SPFA算法使用了队列来优化计算,从而在某些情况下加速了计算过程。
SPFA算法的基本思想是从源节点开始,将源节点放入队列中,然后不断从队列中取出节点,考察它的邻接节点,以更新到这些邻接节点的最短距离。如果某个节点的最短距离被更新,且该节点不在队列中,那么将该节点加入队列中,以便后续继续考察。
复杂度是O(V*E)
步骤
初始化:将源节点的最短距离设置为0,其他节点的最短距离设置为无穷大(或一个足够大的值),并将源节点加入队列中。
迭代处理队列中的节点:
从队列中取出一个节点。
考察该节点的所有邻接节点,如果通过当前节点到达邻接节点的路径比已知的最短路径更短,则更新邻接节点的最短路径。
如果邻接节点的最短路径被更新,且邻接节点不在队列中,将它加入队列中。
重复步骤2,直到队列为空。
最短路径计算完成后,可以从源节点到任意目标节点的最短路径已知。
原则
只让当前点能到达的点入队
如果一个点已经在队列里, ...
algorithm-dijkstra
Dijkstra算法
概念
Dijkstra 算法是一个可以解决单一源点最短路径问题的经典算法,本质上是对广度优先搜索(BFS)的一个推广,只是把 BFS 维护的栈换成了优先队列。
Dijkstra算法成立的前提条件是不存在负权的边,这意味任何一条路径,从起点开始到路径中每个点的距离都是依次递增的。所以按照递增的顺序来依次计算出最短路径也就是Dijkstra算法了
每次循环都会增多一个保证已经找到最短路的点。
直观来说,如果我们已经求出了k个离源点距离最近的点,以及它们各自的距离,那么到源点距离第k+1近的点,它到源点的最短路径只能经过这前k个点——如果经过了其他点,那么这个其他点显然离源点更近,那这个点一定不是第k+1近了。既然只经过这前k个点,那么只用这前k个点放缩就可以找到那个最短路径了。再加上前k-1个点上一轮已经放缩过,所以每一轮只需要用新加入的节点进行放缩就行了。
无法处理有负边的图
举例:
graph LR
s --2--> u -- -3--> v
s --1--> v
第一次贪心得到的点的路径s->v不是最短路
拓展 ...