To install click the Add extension button. That's it.

The source code for the WIKI 2 extension is being checked by specialists of the Mozilla Foundation, Google, and Apple. You could also do it yourself at any point in time.

4,5
Kelly Slayton
Congratulations on this excellent venture… what a great idea!
Alexander Grigorievskiy
I use WIKI 2 every day and almost forgot how the original Wikipedia looks like.
Live Statistics
English Articles
Improved in 24 Hours
Added in 24 Hours
Languages
Recent
Show all languages
What we do. Every page goes through several hundred of perfecting techniques; in live mode. Quite the same Wikipedia. Just better.
.
Leo
Newton
Brights
Milds

Shortest path faster algorithm

From Wikipedia, the free encyclopedia

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

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

YouTube Encyclopedic

  • 1/5
    Views:
    2 247 762
    1 248 733
    11 588
    141 364
    1 631
  • 4.2 All Pairs Shortest Path (Floyd-Warshall) - Dynamic Programming
  • Dijkstra's algorithm in 3 minutes
  • How to Find the Shortest Path - Intro to Algorithms
  • Shortest/Longest path on a Directed Acyclic Graph (DAG) | Graph Theory
  • All Pairs Shortest Path - Georgia Tech - Computability, Complexity, Theory: Algorithms

Transcription

Algorithm

Given a weighted directed graph and a source vertex , SPFA finds 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 is similar to the Bellman-Ford algorithm in that each vertex is used as a candidate to relax its adjacent vertices. However, instead of trying all vertices blindly, SPFA maintains a queue of candidate vertices and adds a vertex to the queue only if that vertex is relaxed, repeating the process until no more vertices can be relaxed.

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

A demo of SPFA based on Euclidean distance. Red lines are the shortest path covering (so far observed). Blue lines indicate where relaxing happens, i.e., connecting with a node in , which gives 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 be applied to an undirected graph by replacing each undirected edge with two directed edges of opposite directions.

Proof of correctness

It is possible to prove that the algorithm always finds the shortest path.

Lemma: Whenever the queue is checked for emptiness, any vertex currently capable of causing relaxation is in the queue.
Proof: To show that if for any two vertices and at the time the condition is checked, is in the queue. We do so by induction on the number of iterations of the loop that have already occurred. First we note that this holds before the loop is entered: İf , then relaxation is not possible; relaxation is possible from , and this is added to the queue immediately before the while loop is entered. Now, consider what happens inside the loop. A vertex is popped, and is used to relax all its neighbors, if possible. Therefore, immediately after that iteration of the loop, is not capable of causing any more relaxations (and does not have 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 into 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 a 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

Experiments show 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

The performance of the algorithm is strongly determined by the order in which candidate vertices are used to relax other vertices. In fact, if is a priority queue, then the algorithm resembles Dijkstra's. However, since a priority queue is not used here, two techniques are sometimes employed to improve the quality of the queue, which in turn improves the average-case performance (but not the worst-case performance). Both techniques rearrange the order of 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

  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.
This page was last edited on 12 April 2024, at 00:16
Basis of this page is in Wikipedia. Text is available under the CC BY-SA 3.0 Unported License. Non-text media are available under their specified licenses. Wikipedia® is a registered trademark of the Wikimedia Foundation, Inc. WIKI 2 is an independent company and has no affiliation with Wikimedia Foundation.