❶ SPFASPFA算法
SPFA算法,全称为Shortest Path Faster Algorithm,是由西南交通大学的段凡丁在1994年提出的一种求解单源最短路问题的有效算法。该算法在处理存在负权边的图时尤为适用,当Dijkstra等算法失效,而Bellman-Ford算法复杂度过高时,SPFA算法就能发挥作用。
我们假设给定的有向加权图G不存在负权回路,这样最短路径的存在是确定的。虽然在执行前可以先通过拓扑排序检查,但这不是算法的核心。算法的关键在于使用一个先进先出的队列存储待优化节点,每次从队列头部取出节点u,对离开u的所有邻接节点v进行松弛操作。如果v的估计最短路径值改变且不在队列中,就将v加入队尾。这个过程将持续,直到队列为空。其原理是,只要最短路径存在,SPFA算法必然能找到最小值。
算法的时间复杂度期望为O(ke),其中k是所有顶点进队的平均次数,一般小于等于2。具体实现是:初始化队列和一个记录最短路径的表格,起始点的最短路径值设为极大值(自身为0)。然后执行松弛操作,若更新路径且未入队,将该点加入队尾,重复此过程直到队列为空。通过节点进队次数判断是否存在负环:如果某个点超过n次进入队列,说明存在负权回路,此时无最短路径,算法将无限进行直到发现负环。
❷ SPFA算法SPFA算法
SPFA算法,全称为Shortest Path Faster Algorithm,是由西南交通大学段凡丁在1994年提出的一种求解单源最短路径问题的高效算法。在处理图中存在负权边的情况时,如Dijkstra算法不再适用,Bellman-Ford算法复杂度偏高,SPFA算法就能派上用场。
算法的核心原理是动态逼近法,利用一个先进先出的队列存储待优化的节点。通过松弛操作,以起点u的当前最短路径估计值更新其邻接节点v的值。若更新后v不在队列中,将其加入队尾。此过程持续直至队列为空。该算法确保只要有最短路径存在,最终一定能找到最小值。
SPFA的期望时间复杂度为O(ke),其中k是所有顶点平均入队次数,通常k小于等于2。其基本实现包括创建队列,初始时仅包含起点,以及一个记录最短路径的表格(初始值设为极大值,起点到本身的路径设为0)。通过松弛操作不断更新路径,如果刷新成功且新加入的点不在队列中,将其加入队尾,直至队列为空。
值得注意的是,SPFA算法在判断图中是否存在负权环时,如果某个点入队次数超过图中节点总数N,说明存在负环,此时SPFA算法无法处理带负环的图。