CPE346 - Shortest Paths Algorithms
CPE346 - Shortest Paths Algorithms
S HORTEST P ATHS
http://algs4.cs.princeton.edu
fi
Shortest paths in an edge-weighted digraph
edge-weighted digraph
4->5 0.35
5->4 0.35
4->7 0.37
5->7 0.28
7->5 0.28
5->1 0.32
0->4 0.38
0->2 0.26
7->3 0.39 shortest path from 0 to 6
1->3 0.29
0->2 0.26
2->7 0.34
2->7 0.34
6->2 0.40
7->3 0.39
3->6 0.52
3->6 0.52
6->0 0.58
6->4 0.93
2
fi
Google maps
3
Shortest path applications
PERT/CPM.
Map routing.
Seam carving.
Texture mapping.
Robot navigation.
Typesetting in TeX. http://en.wikipedia.org/wiki/Seam_carving
Reference: Network Flows: Theory, Algorithms, and Applications, R. K. Ahuja, T. L. Magnanti, and J. B. Orlin, Prentice Hall, 1993.
4
fi
fi
Shortest path variants
Which vertices?
Single source: from one vertex s to every other vertex.
Single sink: from every vertex to one vertex t.
Source-sink: from one vertex s to another t.
All pairs: between all pairs of vertices.
Cycles?
No directed cycles.
No "negative cycles."
which variant?
http://algs4.cs.princeton.edu
Weighted directed edge API
weight
v w
7
Weighted directed edge: implementation in Java
tinyEWD.txt
V 0 2 .26 0 4 .38
8 E
15
4 5 0.35 1 3 .29
adj
5 4 0.35
0
4 7 0.37 2 7 .34 Bag objects
5 7 0.28 1
7 5 0.28 2
5 1 0.32 3 6 .52 reference to a
3 DirectedEdge
0 4 0.38
0 2 0.26 4 object
4 7 .37 4 5 .35
7 3 0.39 5
1 3 0.29
6
2 7 0.34 5 1 .32 5 7 .28 5 4 .35
6 2 0.40 7
3 6 0.52
6 4 .93 6 0 .58 6 2 .40
6 0 0.58
6 4 0.93
7 3 .39 7 5 .28
10
Edge-weighted digraph: adjacency-lists implementation in Java
public EdgeWeightedDigraph(int V)
{
this.V = V;
adj = (Bag<DirectedEdge>[]) new Bag[V];
for (int v = 0; v < V; v++)
adj[v] = new Bag<DirectedEdge>();
}
add edge e = v→w to
public void addEdge(DirectedEdge e) only v's adjacency list
{
int v = e.from();
adj[v].add(e);
}
11
fi
fi
Single-source shortest paths API
public class SP
public class SP
% java SP tinyEWD.txt 0
0 to 0 (0.00):
0 to 1 (1.05): 0->4 0.38 4->5 0.35 5->1 0.32
0 to 2 (0.26): 0->2 0.26
0 to 3 (0.99): 0->2 0.26 2->7 0.34 7->3 0.39
0 to 4 (0.38): 0->4 0.38
0 to 5 (0.73): 0->4 0.38 4->5 0.35
0 to 6 (1.51): 0->2 0.26 2->7 0.34 7->3 0.39 3->6 0.52
0 to 7 (0.60): 0->2 0.26 2->7 0.34 13
Generic shortest-paths algorithm
14
fi
fi
S HORTEST P ATHS
‣ APIs
‣ Dijkstra's algorithm
‣ Bellman-Ford algorithm
Algorithms
R OBERT S EDGEWICK | K EVIN W AYNE
http://algs4.cs.princeton.edu
Dijkstra's algorithm demo
0→1 5.0
1 15 3
0→4 9.0
5 0→7 8.0
4
12
s 0 3 1→2 12.0
8 1→3 15.0
7 7 2 9
1→7 4.0
9 2→3 3.0
6 1
11 2→6 11.0
5
3→6 9.0
5
4 4→5 4.0
13
4→6 20.0
4 20 6 4→7 5.0
5→2 1.0
5→6 13.0
an edge-weighted digraph 7→5 6.0
7→2 7.0
16
Dijkstra's algorithm demo
1 3
v distTo[] edgeTo[]
0 0.0 -
0 1
2
7 2 3
4
5
5 6
7
4 6
17
Dijkstra's algorithm demo
0 1
8 ∞ 2
7 2 3
9 4
5
5 6
7
4 6
18
Dijkstra's algorithm demo
1 3
v distTo[] edgeTo[]
0 5 0 0.0 -
0 1 5.0 0→1
8 ∞ 8 2
7 2 3
9 4 9.0 0→4
5
5 6
7 8.0 0→7
4 6
∞ 9
19
Dijkstra's algorithm demo
1 3
v distTo[] edgeTo[]
0 0.0 -
0 1 5.0 0→1
2
7 2 3
4 9.0 0→4
5
5 6
7 8.0 0→7
4 6
20
Dijkstra's algorithm demo
1 3
v distTo[] edgeTo[]
0 0.0 -
0 1 5.0 0→1
2
7 2 3
4 9.0 0→4
5
5 6
7 8.0 0→7
4 6
choose vertex 1
21
Dijkstra's algorithm demo
4 6
22
Dijkstra's algorithm demo
4 6
23
Dijkstra's algorithm demo
1 3
v distTo[] edgeTo[]
0 0.0 -
0 1 5.0 0→1
2 17.0 1→2
7 2 3 20.0 1→3
4 9.0 0→4
5
5 6
7 8.0 0→7
4 6
24
Dijkstra's algorithm demo
1 3
v distTo[] edgeTo[]
0 0.0 -
0 1 5.0 0→1
2 17.0 1→2
7 2 3 20.0 1→3
4 9.0 0→4
5
5 6
7 8.0 0→7
4 6
choose vertex 7
25
Dijkstra's algorithm demo
1 3
v distTo[] edgeTo[]
0 0.0 -
0 1 5.0 0→1
8 2 17.0 1→2
7 17
7 2 3 20.0 1→3
4 9.0 0→4
6
5
5 6
∞ 7 8.0 0→7
4 6
26
Dijkstra's algorithm demo
1 3
v distTo[] edgeTo[]
0 0.0 -
0 1 5.0 0→1
8 2 15.0 7→2
7 17 15
7 2 3 20.0 1→3
4 9.0 0→4
6
5 14.0 7→5
5 6
∞ 7 8.0 0→7
14
4 6
27
Dijkstra's algorithm demo
1 3
v distTo[] edgeTo[]
0 0.0 -
0 1 5.0 0→1
2 15.0 7→2
7 2 3 20.0 1→3
4 9.0 0→4
5 14.0 7→5
5 6
7 8.0 0→7
4 6
28
Dijkstra's algorithm demo
1 3
v distTo[] edgeTo[]
0 0.0 -
0 1 5.0 0→1
2 15.0 7→2
7 2 3 20.0 1→3
4 9.0 0→4
5 14.0 7→5
5 6
7 8.0 0→7
4 6
select vertex 4
29
Dijkstra's algorithm demo
1 3
v distTo[] edgeTo[]
0 0.0 -
0 1 5.0 0→1
8 2 15.0 7→2
7 2 3 20.0 1→3
4 9.0 0→4
5 14.0 7→5
5
5 14 6
4 7 8.0 0→7
9 4 20 6 ∞
30
Dijkstra's algorithm demo
1 3
v distTo[] edgeTo[]
0 0.0 -
0 1 5.0 0→1
8 2 15.0 7→2
7 2 3 20.0 1→3
4 9.0 0→4
5 13.0 4→5
5
5 14 13 6 29.0 4→6
4 7 8.0 ✔
0→7
9 4 20 6 ∞ 29
31
Dijkstra's algorithm demo
1 3
v distTo[] edgeTo[]
0 0.0 -
0 1 5.0 0→1
2 15.0 7→2
7 2 3 20.0 1→3
4 9.0 0→4
5 13.0 4→5
5 6 29.0 4→6
7 8.0 0→7
4 6
32
Dijkstra's algorithm demo
1 3
v distTo[] edgeTo[]
0 0.0 -
0 1 5.0 0→1
2 15.0 7→2
7 2 3 20.0 1→3
4 9.0 0→4
5 13.0 4→5
5 6 29.0 4→6
7 8.0 0→7
4 6
select vertex 5
33
Dijkstra's algorithm demo
1 3
v distTo[] edgeTo[]
0 0.0 -
0 1 5.0 0→1
2 15.0 7→2
7 2 15 3 20.0 1→3
4 9.0 0→4
1
5 13.0 4→5
5 6 29.0 4→6
13 7 8.0 0→7
13
4 6 29
34
Dijkstra's algorithm demo
1 3
v distTo[] edgeTo[]
0 0.0 -
0 1 5.0 0→1
2 14.0 5→2
7 2 15 14 3 20.0 1→3
4 9.0 0→4
1
5 13.0 4→5
5 6 26.0 5→6
13 7 8.0 0→7
13
4 6 29 26
35
Dijkstra's algorithm demo
1 3
v distTo[] edgeTo[]
0 0.0 -
0 1 5.0 0→1
2 14.0 5→2
7 2 3 20.0 1→3
4 9.0 0→4
5 13.0 4→5
5 6 26.0 5→6
7 8.0 0→7
4 6
36
Dijkstra's algorithm demo
1 3
v distTo[] edgeTo[]
0 0.0 -
0 1 5.0 0→1
2 14.0 5→2
7 2 3 20.0 1→3
4 9.0 0→4
5 13.0 4→5
5 6 26.0 5→6
7 8.0 0→7
4 6
select vertex 2
37
Dijkstra's algorithm demo
1 3
v distTo[] edgeTo[]
0 0.0 -
0 3 1 5.0 0→1
2 14.0 5→2
7 2 14 3 20.0 1→3
4 9.0 0→4
11 5 13.0 4→5
5 6 26.0 5→6
7 8.0 0→7
4 6 26
38
Dijkstra's algorithm demo
1 3
v distTo[] edgeTo[]
0 0.0 -
0 3 1 5.0 0→1
2 14.0 5→2
7 2 14 3 17.0 2→3
4 9.0 0→4
11 5 13.0 4→5
5 6 25.0 2→6
7 8.0 0→7
4 6 26 25
39
Dijkstra's algorithm demo
1 3
v distTo[] edgeTo[]
0 0.0 -
0 1 5.0 0→1
2 14.0 5→2
7 2 3 17.0 2→3
4 9.0 0→4
5 13.0 4→5
5 6 25.0 2→6
7 8.0 0→7
4 6
40
Dijkstra's algorithm demo
1 3
v distTo[] edgeTo[]
0 0.0 -
0 1 5.0 0→1
2 14.0 5→2
7 2 3 17.0 2→3
4 9.0 0→4
5 13.0 4→5
5 6 25.0 2→6
7 8.0 0→7
4 6
select vertex 3
41
Dijkstra's algorithm demo
1 3
v distTo[] edgeTo[]
0 0.0 -
0 1 5.0 0→1
2 14.0 5→2
7 2 9
3 17.0 2→3
4 9.0 0→4
5 13.0 4→5
5 6 25.0 2→6
7 8.0 0→7
4 6 25
42
Dijkstra's algorithm demo
1 3
v distTo[] edgeTo[]
0 0.0 -
0 1 5.0 0→1
2 14.0 5→2
7 2 9
3 17.0 2→3
4 9.0 0→4
5 13.0 4→5
5 6 25.0 ✔
2→6
7 8.0 0→7
4 6 25
43
Dijkstra's algorithm demo
1 3
v distTo[] edgeTo[]
0 0.0 -
0 1 5.0 0→1
2 14.0 5→2
7 2 3 17.0 2→3
4 9.0 0→4
5 13.0 4→5
5 6 25.0 2→6
7 8.0 0→7
4 6
44
Dijkstra's algorithm demo
1 3
v distTo[] edgeTo[]
0 0.0 -
0 1 5.0 0→1
2 14.0 5→2
7 2 3 17.0 2→3
4 9.0 0→4
5 13.0 4→5
5 6 25.0 2→6
7 8.0 0→7
4 6
select vertex 6
45
Dijkstra's algorithm demo
1 3
v distTo[] edgeTo[]
0 0.0 -
0 1 5.0 0→1
2 14.0 5→2
7 2 3 17.0 2→3
4 9.0 0→4
5 13.0 4→5
5 6 25.0 2→6
7 8.0 0→7
4 6
46
Dijkstra's algorithm demo
1 3
v distTo[] edgeTo[]
0 0.0 -
0 1 5.0 0→1
2 14.0 5→2
7 2 3 17.0 2→3
4 9.0 0→4
5 13.0 4→5
5 6 25.0 2→6
7 8.0 0→7
4 6
47
Dijkstra's algorithm demo
1 3
v distTo[] edgeTo[]
0 0.0 -
s 0 1 5.0 0→1
2 14.0 5→2
7 2 3 17.0 2→3
4 9.0 0→4
5 13.0 4→5
5 6 25.0 2→6
7 8.0 0→7
4 6
48
Dijkstra's algorithm visualization
49
Dijkstra's algorithm visualization
50
Dijkstra's algorithm: correctness proof 1
Pf.
Each edge e = v→w is relaxed exactly once (when vertex v is relaxed),
leaving distTo[w] ≤ distTo[v] + e.weight().
Inequality holds until algorithm terminates because:
– distTo[w] cannot increase distTo[] values are monotone decreasing
– distTo[v] will not change we choose lowest distTo[] value at each step
(and edge weights are nonnegative)
51
Dijkstra's algorithm: Java implementation
pq.insert(s, 0.0);
while (!pq.isEmpty())
{
int v = pq.delMin();
for (DirectedEdge e : G.adj(v)) 52
Dijkstra's algorithm: Java implementation
53
Dijkstra's algorithm: which priority queue?
unordered array 1 V 1 V2
Fibonacci heap
1† log V † 1† E + V log V
† amortized
Bottom line.
Array implementation optimal for dense graphs.
Binary heap much faster for sparse graphs.
4-way heap worth the trouble in performance-critical situations.
Fibonacci heap best in theory, but not worth implementing.
54
S HORTEST P ATHS
‣ APIs
‣ Dijkstra's algorithm
‣ Bellman-Ford algorithm
Algorithms
R OBERT S EDGEWICK | K EVIN W AYNE
http://algs4.cs.princeton.edu
Shortest paths with negative weights: failed attempts
0 6 1
3 3 2
0 14 1
3 11 2
Def. A negative cycle is a directed cycle whose sum of edge weights is negative.
digraph
4->5 0.35
s
5->4 -0.66
4->7 0.37
5->7 0.28
7->5 0.28
5->1 0.32
0->4 0.38
0->2 0.26
7->3 0.39
1->3 0.29 negative cycle (-0.66 + 0.37 + 0.28)
2->7 0.34 5->4->7->5
6->2 0.40
3->6 0.52
6->0 0.58 shortest path from 0 to 6
6->4 0.93 0->4->7->5->4->7->5...->1->3->6
Bellman-Ford algorithm
Repeat V times:
- Relax each edge.
58
Bellman-Ford algorithm demo
0→1 5.0
0→4 9.0
0→7 8.0
1 15 3
1→2 12.0
5
4 1→3 15.0
12
s 0 3
8 1→7 4.0
7 2 9
7 2→3 3.0
9 6 2→6 11.0
1
11
5 3→6 9.0
5
4 4→5 4.0
13
4→6 20.0
4 20 6
4→7 5.0
5→2 1.0
an edge-weighted digraph
5→6 13.0
7→5 6.0
59
Bellman-Ford algorithm demo
1 3
v distTo[] edgeTo[]
0 0.0 -
0 1
2
7 2 3
4
5
5 6
7
4 6
initialize
60
Bellman-Ford algorithm demo
distTo[1]
∞
1 3
distTo[0] v distTo[] edgeTo[]
0 5 0 0.0 -
0 1
2
7 2 3
4
5
5 6
7
4 6
pass 0
0→1 0→4 0→7 1→2 1→3 1→7 2→3 2→6 3→6 4→5 4→6 4→7 5→2 5→6 7→5 7→2
61
Bellman-Ford algorithm demo
∞ 5
1 3
v distTo[] edgeTo[]
0 5 0 0.0 -
0 1 5.0 0→1
2
7 2 3
4
5
5 6
7
4 6
pass 0
0→1 0→4 0→7 1→2 1→3 1→7 2→3 2→6 3→6 4→5 4→6 4→7 5→2 5→6 7→5 7→2
62
Bellman-Ford algorithm demo
1 3
v distTo[] edgeTo[]
0 0 0.0 -
0 1 5.0 0→1
2
7 2 3
9 4
5
5 6
7
4 6
pass 0
0→1 0→4 0→7 1→2 1→3 1→7 2→3 2→6 3→6 4→5 4→6 4→7 5→2 5→6 7→5 7→2
63
Bellman-Ford algorithm demo
1 3
v distTo[] edgeTo[]
0 0 0.0 -
0 1 5.0 0→1
2
7 2 3
9 4 9.0 0→4
5
5 6
7
4 6
∞ 9
pass 0
0→1 0→4 0→7 1→2 1→3 1→7 2→3 2→6 3→6 4→5 4→6 4→7 5→2 5→6 7→5 7→2
64
Bellman-Ford algorithm demo
1 3
v distTo[] edgeTo[]
0 0 0.0 -
0 1 5.0 0→1
8 ∞ 2
7 2 3
4 9.0 0→4
5
5 6
7
4 6
pass 0
0→1 0→4 0→7 1→2 1→3 1→7 2→3 2→6 3→6 4→5 4→6 4→7 5→2 5→6 7→5 7→2
65
Bellman-Ford algorithm demo
1 3
v distTo[] edgeTo[]
0 0 0.0 -
0 1 5.0 0→1
8 ∞ 8 2
7 2 3
4 9.0 0→4
5
5 6
7 8.0 0→7
4 6
pass 0
0→1 0→4 0→7 1→2 1→3 1→7 2→3 2→6 3→6 4→5 4→6 4→7 5→2 5→6 7→5 7→2
66
Bellman-Ford algorithm demo
5
1 3
v distTo[] edgeTo[]
0 0.0 -
12 1 5.0 0→1
0
2
7 2 ∞ 3
4 9.0 0→4
5
5 6
7 8.0 0→7
4 6
pass 0
0→1 0→4 0→7 1→2 1→3 1→7 2→3 2→6 3→6 4→5 4→6 4→7 5→2 5→6 7→5 7→2
67
Bellman-Ford algorithm demo
5
1 3
v distTo[] edgeTo[]
0 0.0 -
12 1 5.0 0→1
0
2 17.0 1→2
7 2 ∞ 17 3
4 9.0 0→4
5
5 6
7 8.0 0→7
4 6
pass 0
0→1 0→4 0→7 1→2 1→3 1→7 2→3 2→6 3→6 4→5 4→6 4→7 5→2 5→6 7→5 7→2
68
Bellman-Ford algorithm demo
5 ∞
1 15 3
v distTo[] edgeTo[]
0 0.0 -
0 1 5.0 0→1
2 17.0 1→2
7 2 3
4 9.0 0→4
5
5 6
7 8.0 0→7
4 6
pass 0
0→1 0→4 0→7 1→2 1→3 1→7 2→3 2→6 3→6 4→5 4→6 4→7 5→2 5→6 7→5 7→2
69
Bellman-Ford algorithm demo
5 ∞ 20
1 15 3
v distTo[] edgeTo[]
0 0.0 -
0 1 5.0 0→1
2 17.0 1→2
7 2 3 20.0 1→3
4 9.0 0→4
5
5 6
7 8.0 0→7
4 6
pass 0
0→1 0→4 0→7 1→2 1→3 1→7 2→3 2→6 3→6 4→5 4→6 4→7 5→2 5→6 7→5 7→2
70
Bellman-Ford algorithm demo
5
1 3
v distTo[] edgeTo[]
4 0 0.0 -
0 1 5.0 0→1
8 2 17.0 1→2
7 2 3 20.0 1→3
4 9.0 0→4
5
5 6
7 8.0 0→7
4 6
pass 0
0→1 0→4 0→7 1→2 1→3 1→7 2→3 2→6 3→6 4→5 4→6 4→7 5→2 5→6 7→5 7→2
71
Bellman-Ford algorithm demo
20
1 3
v distTo[] edgeTo[]
0 0.0 -
0 3 1 5.0 0→1
2 17.0 1→2
7 2 17 3 20.0 1→3
4 9.0 0→4
5
5 6
7 8.0 0→7
4 6
pass 0
0→1 0→4 0→7 1→2 1→3 1→7 2→3 2→6 3→6 4→5 4→6 4→7 5→2 5→6 7→5 7→2
72
Bellman-Ford algorithm demo
1 3
v distTo[] edgeTo[]
0 0.0 -
0 1 5.0 0→1
2 17.0 1→2
7 2 17 3 20.0 1→3
4 9.0 0→4
11 5
5 6
7 8.0 0→7
4 6 ∞
pass 0
0→1 0→4 0→7 1→2 1→3 1→7 2→3 2→6 3→6 4→5 4→6 4→7 5→2 5→6 7→5 7→2
73
Bellman-Ford algorithm demo
1 3
v distTo[] edgeTo[]
0 0.0 -
0 1 5.0 0→1
2 17.0 1→2
7 2 17 3 20.0 1→3
4 9.0 0→4
11 5
5 6 28.0 2→6
7 8.0 0→7
4 6 ∞ 28
pass 0
0→1 0→4 0→7 1→2 1→3 1→7 2→3 2→6 3→6 4→5 4→6 4→7 5→2 5→6 7→5 7→2
74
Bellman-Ford algorithm demo
20
1 3
v distTo[] edgeTo[]
0 0.0 -
0 1 5.0 0→1
2 17.0 1→2
7 2 9
3 20.0 1→3
4 9.0 0→4
5
5 6 28.0 2→6
7 8.0 0→7
4 6 28
pass 0
0→1 0→4 0→7 1→2 1→3 1→7 2→3 2→6 3→6 4→5 4→6 4→7 5→2 5→6 7→5 7→2
75
Bellman-Ford algorithm demo
1 3
v distTo[] edgeTo[]
0 0.0 -
0 1 5.0 0→1
2 17.0 1→2
7 2 3 20.0 1→3
4 9.0 0→4
5
5 6 28.0 2→6
4
∞ 7 8.0 0→7
4 6
pass 0
0→1 0→4 0→7 1→2 1→3 1→7 2→3 2→6 3→6 4→5 4→6 4→7 5→2 5→6 7→5 7→2
76
Bellman-Ford algorithm demo
1 3
v distTo[] edgeTo[]
0 0.0 -
0 1 5.0 0→1
2 17.0 1→2
7 2 3 20.0 1→3
4 9.0 0→4
5 13.0 4→5
5 6 28.0 2→6
4
∞ 13 7 8.0 0→7
4 6
pass 0
0→1 0→4 0→7 1→2 1→3 1→7 2→3 2→6 3→6 4→5 4→6 4→7 5→2 5→6 7→5 7→2
77
Bellman-Ford algorithm demo
1 3
v distTo[] edgeTo[]
0 0.0 -
0 1 5.0 0→1
2 17.0 1→2
7 2 3 20.0 1→3
4 9.0 0→4
5 13.0 4→5
5 6 28.0 2→6
7 8.0 0→7
4 20 6
9 28
pass 0
0→1 0→4 0→7 1→2 1→3 1→7 2→3 2→6 3→6 4→5 4→6 4→7 5→2 5→6 7→5 7→2
78
Bellman-Ford algorithm demo
1 3
v distTo[] edgeTo[]
0 0.0 -
0 1 5.0 0→1
8 2 17.0 1→2
7 2 3 20.0 1→3
4 9.0 0→4
5 13.0 4→5
5
5 6 28.0 2→6
7 8.0 0→7
4 6
pass 0
0→1 0→4 0→7 1→2 1→3 1→7 2→3 2→6 3→6 4→5 4→6 4→7 5→2 5→6 7→5 7→2
79
Bellman-Ford algorithm demo
1 3
v distTo[] edgeTo[]
0 0.0 -
0 1 5.0 0→1
2 17.0 1→2
7 2 17 3 20.0 1→3
4 9.0 0→4
1
5 13.0 4→5
5 6 28.0 2→6
13 7 8.0 0→7
4 6
pass 0
0→1 0→4 0→7 1→2 1→3 1→7 2→3 2→6 3→6 4→5 4→6 4→7 5→2 5→6 7→5 7→2
80
Bellman-Ford algorithm demo
1 3
v distTo[] edgeTo[]
0 0.0 -
0 1 5.0 0→1
2 14.0 5→2
7 2 17 14 3 20.0 1→3
4 9.0 0→4
1
5 13.0 4→5
5 6 28.0 2→6
13 7 8.0 0→7
4 6
pass 0
0→1 0→4 0→7 1→2 1→3 1→7 2→3 2→6 3→6 4→5 4→6 4→7 5→2 5→6 7→5 7→2
81
Bellman-Ford algorithm demo
1 3
v distTo[] edgeTo[]
0 0.0 -
0 1 5.0 0→1
2 14.0 5→2
7 2 3 20.0 1→3
4 9.0 0→4
5 13.0 4→5
5 6 28.0 2→6
13 7 8.0 0→7
13
4 6 28
pass 0
0→1 0→4 0→7 1→2 1→3 1→7 2→3 2→6 3→6 4→5 4→6 4→7 5→2 5→6 7→5 7→2
82
Bellman-Ford algorithm demo
1 3
v distTo[] edgeTo[]
0 0.0 -
0 1 5.0 0→1
2 14.0 5→2
7 2 3 20.0 1→3
4 9.0 0→4
5 13.0 4→5
5 6 26.0 5→6
13 7 8.0 0→7
13
4 6 28 26
pass 0
0→1 0→4 0→7 1→2 1→3 1→7 2→3 2→6 3→6 4→5 4→6 4→7 5→2 5→6 7→5 7→2
83
Bellman-Ford algorithm demo
1 3
v distTo[] edgeTo[]
0 0.0 -
0 1 5.0 0→1
8 2 14.0 5→2
7 2 3 20.0 1→3
6 4 9.0 0→4
5 13.0 4→5
5 6 26.0 5→6
13 7 8.0 0→7
4 6
pass 0
0→1 0→4 0→7 1→2 1→3 1→7 2→3 2→6 3→6 4→5 4→6 4→7 5→2 5→6 7→5 7→2
84
Bellman-Ford algorithm demo
1 3
v distTo[] edgeTo[]
0 0.0 -
0 1 5.0 0→1
8 2 14.0 5→2
7 7 2 14 3 20.0 1→3
4 9.0 0→4
5 13.0 4→5
5 6 26.0 5→6
7 8.0 0→7
4 6
pass 0
0→1 0→4 0→7 1→2 1→3 1→7 2→3 2→6 3→6 4→5 4→6 4→7 5→2 5→6 7→5 7→2
85
Bellman-Ford algorithm demo
1 3
v distTo[] edgeTo[]
0 5 0 0.0 -
0 1 5.0 0→1
2 14.0 5→2
7 2 3 20.0 1→3
4 9.0 0→4
5 13.0 4→5
5 6 26.0 5→6
7 8.0 0→7
4 6
pass 1
0→1 0→4 0→7 1→2 1→3 1→7 2→3 2→6 3→6 4→5 4→6 4→7 5→2 5→6 7→5 7→2
86
Bellman-Ford algorithm demo
1 3
v distTo[] edgeTo[]
0 0 0.0 -
0 1 5.0 0→1
2 14.0 5→2
7 2 3 20.0 1→3
9 4 9.0 0→4
5 13.0 4→5
5 6 26.0 5→6
7 8.0 0→7
4 6
pass 1
0→1 0→4 0→7 1→2 1→3 1→7 2→3 2→6 3→6 4→5 4→6 4→7 5→2 5→6 7→5 7→2
87
Bellman-Ford algorithm demo
1 3
v distTo[] edgeTo[]
0 0 0.0 -
0 1 5.0 0→1
8 8 2 14.0 5→2
7 2 3 20.0 1→3
4 9.0 0→4
5 13.0 4→5
5 6 26.0 5→6
7 8.0 0→7
4 6
pass 1
0→1 0→4 0→7 1→2 1→3 1→7 2→3 2→6 3→6 4→5 4→6 4→7 5→2 5→6 7→5 7→2
88
Bellman-Ford algorithm demo
5
1 3
v distTo[] edgeTo[]
0 0.0 -
12 1 5.0 0→1
0
2 14.0 5→2
7 2 14 3 20.0 1→3
4 9.0 0→4
5 13.0 4→5
5 6 26.0 5→6
7 8.0 0→7
4 6
pass 1
0→1 0→4 0→7 1→2 1→3 1→7 2→3 2→6 3→6 4→5 4→6 4→7 5→2 5→6 7→5 7→2
89
Bellman-Ford algorithm demo
5 20
1 15 3
v distTo[] edgeTo[]
0 0.0 -
0 1 5.0 0→1
2 14.0 5→2
7 2 3 20.0 1→3
4 9.0 0→4
5 13.0 4→5
5 6 26.0 5→6
7 8.0 0→7
4 6
pass 1
0→1 0→4 0→7 1→2 1→3 1→7 2→3 2→6 3→6 4→5 4→6 4→7 5→2 5→6 7→5 7→2
90
Bellman-Ford algorithm demo
5
1 3
v distTo[] edgeTo[]
4 0 0.0 -
0 1 5.0 0→1
8 2 14.0 5→2
7 2 3 20.0 1→3
4 9.0 0→4
5 13.0 4→5
5 6 26.0 5→6
7 8.0 0→7
4 6
pass 1
0→1 0→4 0→7 1→2 1→3 1→7 2→3 2→6 3→6 4→5 4→6 4→7 5→2 5→6 7→5 7→2
91
Bellman-Ford algorithm demo
20
1 3
v distTo[] edgeTo[]
0 0.0 -
0 3 1 5.0 0→1
2 14.0 5→2
7 2 14 3 20.0 1→3
4 9.0 0→4
5 13.0 4→5
5 6 26.0 5→6
7 8.0 0→7
4 6
pass 1
0→1 0→4 0→7 1→2 1→3 1→7 2→3 2→6 3→6 4→5 4→6 4→7 5→2 5→6 7→5 7→2
92
Bellman-Ford algorithm demo
20 17
1 3
v distTo[] edgeTo[]
0 0.0 -
0 3 1 5.0 0→1
2 14.0 5→2
7 2 14 3 17.0 2→3
4 9.0 0→4
5 13.0 4→5
5 6 26.0 5→6
7 8.0 0→7
4 6
pass 1
0→1 0→4 0→7 1→2 1→3 1→7 2→3 2→6 3→6 4→5 4→6 4→7 5→2 5→6 7→5 7→2
93
Bellman-Ford algorithm demo
1 3
v distTo[] edgeTo[]
0 0.0 -
0 1 5.0 0→1
2 14.0 5→2
7 2 14 3 17.0 2→3
4 9.0 0→4
11 5 13.0 4→5
5 6 26.0 5→6
7 8.0 0→7
4 6 26
pass 1
0→1 0→4 0→7 1→2 1→3 1→7 2→3 2→6 3→6 4→5 4→6 4→7 5→2 5→6 7→5 7→2
94
Bellman-Ford algorithm demo
1 3
v distTo[] edgeTo[]
0 0.0 -
0 1 5.0 0→1
2 14.0 5→2
7 2 14 3 17.0 2→3
4 9.0 0→4
11 5 13.0 4→5
5 6 25.0 2→6
7 8.0 0→7
4 6 26 25
pass 1
0→1 0→4 0→7 1→2 1→3 1→7 2→3 2→6 3→6 4→5 4→6 4→7 5→2 5→6 7→5 7→2
95
Bellman-Ford algorithm demo
17
1 3
v distTo[] edgeTo[]
0 0.0 -
0 1 5.0 0→1
2 14.0 5→2
7 2 9
3 17.0 2→3
4 9.0 0→4
5 13.0 4→5
5 6 25.0 2→6
7 8.0 0→7
4 6 25
pass 1
0→1 0→4 0→7 1→2 1→3 1→7 2→3 2→6 3→6 4→5 4→6 4→7 5→2 5→6 7→5 7→2
96
Bellman-Ford algorithm demo
1 3
v distTo[] edgeTo[]
0 0.0 -
0 1 5.0 0→1
2 14.0 5→2
7 2 3 17.0 2→3
4 9.0 0→4
5 13.0 4→5
5 6 25.0 2→6
4
13 7 8.0 0→7
4 6
pass 1
0→1 0→4 0→7 1→2 1→3 1→7 2→3 2→6 3→6 4→5 4→6 4→7 5→2 5→6 7→5 7→2
97
Bellman-Ford algorithm demo
1 3
v distTo[] edgeTo[]
0 0.0 -
0 1 5.0 0→1
2 14.0 5→2
7 2 3 17.0 2→3
4 9.0 0→4
5 13.0 4→5
5 6 25.0 2→6
7 8.0 0→7
4 20 6
9 25
pass 1
0→1 0→4 0→7 1→2 1→3 1→7 2→3 2→6 3→6 4→5 4→6 4→7 5→2 5→6 7→5 7→2
98
Bellman-Ford algorithm demo
1 3
v distTo[] edgeTo[]
0 0.0 -
0 1 5.0 0→1
8 2 14.0 5→2
7 2 3 17.0 2→3
4 9.0 0→4
5 13.0 4→5
5
5 6 25.0 2→6
7 8.0 0→7
4 6
pass 1
0→1 0→4 0→7 1→2 1→3 1→7 2→3 2→6 3→6 4→5 4→6 4→7 5→2 5→6 7→5 7→2
99
Bellman-Ford algorithm demo
1 3
v distTo[] edgeTo[]
0 0.0 -
0 1 5.0 0→1
2 14.0 5→2
7 2 14 3 17.0 2→3
4 9.0 0→4
1
5 13.0 4→5
5 6 25.0 2→6
13 7 8.0 0→7
4 6
pass 1
0→1 0→4 0→7 1→2 1→3 1→7 2→3 2→6 3→6 4→5 4→6 4→7 5→2 5→6 7→5 7→2
100
Bellman-Ford algorithm demo
1 3
v distTo[] edgeTo[]
0 0.0 -
0 1 5.0 0→1
2 14.0 5→2
7 2 3 17.0 2→3
4 9.0 0→4
5 13.0 4→5
5 6 25.0 2→6
13 7 8.0 0→7
13
4 6 25
pass 1
0→1 0→4 0→7 1→2 1→3 1→7 2→3 2→6 3→6 4→5 4→6 4→7 5→2 5→6 7→5 7→2
101
Bellman-Ford algorithm demo
1 3
v distTo[] edgeTo[]
0 0.0 -
0 1 5.0 0→1
8 2 14.0 5→2
7 2 3 17.0 2→3
6 4 9.0 0→4
5 13.0 4→5
5 6 25.0 2→6
13 7 8.0 0→7
4 6
pass 1
0→1 0→4 0→7 1→2 1→3 1→7 2→3 2→6 3→6 4→5 4→6 4→7 5→2 5→6 7→5 7→2
102
Bellman-Ford algorithm demo
1 3
v distTo[] edgeTo[]
0 0.0 -
0 1 5.0 0→1
8 2 14.0 5→2
7 7 2 14 3 17.0 2→3
4 9.0 0→4
5 13.0 4→5
5 6 25.0 2→6
7 8.0 0→7
4 6
pass 1
0→1 0→4 0→7 1→2 1→3 1→7 2→3 2→6 3→6 4→5 4→6 4→7 5→2 5→6 7→5 7→2
103
Bellman-Ford algorithm demo
1 3
v distTo[] edgeTo[]
0 0.0 -
0 1 5.0 0→1
2 14.0 5→2
7 2 3 17.0 2→3
4 9.0 0→4
5 13.0 4→5
5 6 25.0 2→6
7 8.0 0→7
4 6
0→1 0→4 0→7 1→2 1→3 1→7 2→3 2→6 3→6 4→5 4→6 4→7 5→2 5→6 7→5 7→2
104
Bellman-Ford algorithm demo
1 3
v distTo[] edgeTo[]
0 0.0 -
s 0 1 5.0 0→1
2 14.0 5→2
7 2 3 17.0 2→3
4 9.0 0→4
5 13.0 4→5
5 6 25.0 2→6
7 8.0 0→7
4 6
105
Bellman-Ford algorithm: visualization
passes
4 7 10
13 SPT
Bellman-Ford algorithm
Repeat V times:
- Relax each edge.
Pf idea. After pass i, found shortest path to each vertex v for which the shortest
path from s to v contains i edges (or fewer).
107
Bellman-Ford algorithm: practical improvement
Overall effect.
The running time is still proportional to E × V in worst case.
But much faster than that in practice.
108
Bellman-Ford algorithm: Java implementation
Dijkstra no negative
E log V E log V V
(binary heap) weights
Bellman-Ford EV EV V
no negative
cycles
Bellman-Ford
E+V EV V
(queue-based)
110