Shortest path faster algorithm

The Shortest Path Faster Algorithm (SPFA) is an enhanced version of the Bellman–Ford algorithm that computes single-source shortest paths in a weighted directed graph. The algorithm performs optimally on sparse random graphs, particularly those with negative-weight edges.[1][2][3] The worst-case complexity of SPFA is equivalent to that of the Bellman–Ford. Dijkstra's algorithm is preferred for graphs with nonnegative edge weights.[4]

SPFA was first introduced by Edward F. Moore in 1959, as a generalization of the breadth-first search;[5] SPFA is Moore's “Algorithm D.” The term “Shortest Path Faster Algorithm (SPFA)” was coined by Fanding Duan, a Chinese researcher who rediscovered the algorithm in 1994.[6]

Algorithm[edit]

Given a weighted directed graph and a source vertex , SPFA determines the shortest path from to each vertex in the graph. The length of the shortest path from to is stored in for each vertex .

SPFA improves upon the Bellman-Ford algorithm by selectively using vertices to relax their adjacent vertices. Instead of processing all vertices indiscriminately, SPFA maintains a queue of candidate vertices and only adds a vertex to the queue if it has been relaxed, continuing this process until no further vertices can be relaxed.

Below is the pseudocode for the algorithm.[7] Here is a first-in, first-out queue of candidate vertices, and is the edge weight between .

A demonstration of SPFA based on Euclidean distance. Red lines represent the shortest path coverage (observed so far). Blue lines indicate where relaxing occurs, i.e., connecting with a node in , which results in a shorter path from the source to .
 procedure Shortest-Path-Faster-Algorithm(G, s)   1    for each vertex vs in V(G)   2        d(v) := ∞   3    d(s) := 0   4    push s into Q   5    while Q is not empty do   6        u := poll Q   7        for each edge (u, v) in E(G) do   8            if d(u) + w(u, v) < d(v) then   9                d(v) := d(u) + w(u, v)  10                if v is not in Q then  11                    push v into Q 

The algorithm can also be applied to an undirected graph by treating each undirected edge as two directed edges of opposite directions.

Proof of correctness[edit]

It is feasible to demonstrate that the algorithm consistently identifies the shortest path.

Lemma: Whenever the queue is checked for emptiness, any vertex capable of causing relaxation is in the queue.
Proof: To demonstrate that if for any two vertices and when the condition is checked, is in the queue. We use induction based on the number of iterations of the loop that have occurred. Initially, this holds before the loop starts: If , then relaxation is not possible; relaxation is possible from , and this vertex is added to the queue immediately before the while loop begins. Inside the loop, a vertex is popped and used to relax all its neighbors, if possible. Immediately after that iteration of the loop, is not capable of causing any more relaxations (and does not need to be in the queue anymore). However, the relaxation by might cause some other vertices to become capable of causing relaxation. If there exists some vertex such that before the current loop iteration, then is already in the queue. If this condition becomes true during the current loop iteration, then either increased, which is impossible, or decreased, implying that was relaxed. But after is relaxed, it is added to the queue if it is not already present.
Corollary: The algorithm terminates when and only when no further relaxations are possible.
Proof: If no further relaxations are possible, the algorithm continues to remove vertices from the queue but does not add any more to the queue, because vertices are added only upon successful relaxations. Therefore, the queue becomes empty and the algorithm terminates. If any further relaxations are possible, the queue is not empty, and the algorithm continues to run.

The algorithm fails to terminate if negative-weight cycles are reachable from the source. See here for proof that relaxations are always possible when negative-weight cycles exist. In a graph with no cycles of negative weight, when no more relaxations are possible, the correct shortest paths have been computed (proof). Therefore, in graphs containing no cycles of negative weight, the algorithm will never terminate with incorrect shortest path lengths.[8]

Complexity[edit]

Experiments indicate that the average time complexity of SPFA is on random graphs, and the worst-case time complexity is , which is equal to that of the Bellman-Ford algorithm.[1][9]

Optimization techniques[edit]

The performance of the algorithm is significantly influenced by the order in which candidate vertices are used to relax other vertices. Although is not a priority queue, two techniques are often used to enhance the quality of the queue, thereby improving the average-case performance (but not the worst-case performance). Both techniques reorder the elements in so that vertices closer to the source are processed first. Therefore, when implementing these techniques, is no longer a first-in, first-out (FIFO) queue, but rather a normal doubly linked list or double-ended queue.

Small Label First (SLF) technique:

In line 11 of the above pseudocode, instead of always pushing the vertex to the end of the queue, we compare to , and insert to the front of the queue if is smaller. The pseudo-code for this technique is (after pushing to the end of the queue in line 11):

procedure Small-Label-First(G, Q)     if d(back(Q)) < d(front(Q)) then         u := pop back of Q         push u into front of Q 

Large Label Last (LLL) technique:

After line 11, we update the queue so that the first element is smaller than the average, and any element larger than the average is moved to the end of the queue. The pseudo-code is:

procedure Large-Label-Last(G, Q)     x := average of d(v) for all v in Q     while d(front(Q)) > x         u := pop front of Q         push u to back of Q 

References[edit]

  1. ^ a b "Detail of message". poj.org. Retrieved 2023-12-11.
  2. ^ Pape, U. (1974-12-01). "Implementation and efficiency of Moore-algorithms for the shortest route problem". Mathematical Programming. 7 (1): 212–222. doi:10.1007/BF01585517. ISSN 1436-4646.
  3. ^ Schrijver, Alexander (2012-01-01). "On the history of the shortest path problem". ems.press. Retrieved 2023-12-13.
  4. ^ Zhang, Wei; Chen, Hao; Jiang, Chong; Zhu, Lin. "Improvement And Experimental Evaluation Bellman-Ford Algorithm". Proceedings of the 2013 International Conference on Advanced ICT and Education.
  5. ^ Moore, Edward F. (1959). "The shortest path through a maze". Proceedings of the International Symposium on the Theory of Switching. Harvard University Press. pp. 285–292.
  6. ^ Duan, Fanding (1994). "关于最短路径的SPFA快速算法 [About the SPFA algorithm]". Journal of Southwest Jiaotong University. 29 (2): 207–212.
  7. ^ "Algorithm Gym :: Graph Algorithms".
  8. ^ "Shortest Path Faster Algorithm". wcipeg.
  9. ^ "Worst test case for SPFA". Retrieved 2023-05-14.