re-evaluates the shortest-path estimates of the vertices adjacent to u. The worst-case complexity
of Dijkstra’s algorithm depends on the way of finding the node with the minimum shortest-path
estimate. A naive implementation that examines all nodes in S to find the minimum runs in O(n2)
time. A modified Dijkstra’s algorithm, where the minimum can be found by using binary heaps in
O(log n) time, runs in O(mlog n) time. By using Fibonacci heaps, we can achieve a running time
of O(m + n log n).
Figure 15 gives an example of a directed graph with negative-weight edges for which Dijkstra’s
algorithm produces an incorrect answer.
As Dijkstra’s algorithm proceeds on the graph in Figure 15, it will reach the status shown in
Figure 16. Since edge (g; e) is of negative weight ¡3, the weight of the path (a; g; e) is 5 ¡ 3 = 2.
It is better than the weight of the finalized shortest-path (a; b; d; e), which is of total weight 4.
Furthermore, edge (e; f) has been relaxed. There is no way for Dijkstra’s algorithm to re-relax all
edges affected by this domino effect.
The graph in Figure 17 is a wrong shortest-path tree produced by Dijkstra’s algorithm. Notice
that (g; e) is of negative weight, and is missing in the shortest-paths tree constructed by Djikstra’s
algorithm.
A correct shortest-paths tree is given in Figure 18.
3 The Bellman-Ford Algorithm
Shortest-paths algorithms typically exploit the property that a shortest path between two vertices
contains other shortest paths within it. This optimal substructure property admits both dynamic
programming and the greedy method. We have shown that Dijkstra’s algorithm might fail in