It started out as the Bellman-Ford algorithm, but it was subsequently
modified to try to avoid wasted re-propagations, so that it is now a
hybrid between Bellman-Ford and the Dijkstra algorithm. Basically, it
adopts the potential function idea of Johnson's algorithm to use a
previous assignment that is almost a solution to implicitly re-weight
the edges so that almost all the edges are non-negative. (It doesn't
actually re-weight the edges but calculates the priorities as if they
were re-weighted.) This allows a priority queue as in the Dijkstra
algorithm to direct the propagation to make it unlikely that there
will be more than one propagation from a node. However, unlike pure
Dijkstra, it does allow re-propagations because a few of the re-
weighted edges may still be negative.