DIjkstra's Algorithm
DIjkstra's Algorithm
Dijkstra’s Algorithm
On weighted, directed graph G=(V,E)
for which all edge weights are
nonnegative.
The running time of Dijkstra’s algorithm
is lower than that of the Bellman-Ford
algorithm.
Dijkstra’s Algorithm
DIJKSTRA(G,w,s)
1. INITIALIZE-SINGLE-SOURCE(G,s)
2. S=
3. Q = G.V
4. while Q
5. u = Extract-Min(Q)
6. S = S U {u}
7. for each vertex v G.Adj[u]
8. RELAX(u,v,w)
𝑡 𝑥
1
1
0
9
𝑠 0 2 3 4 6
7
5
2 𝑧
𝑦
Dijkstra’s Algorithm
DIJKSTRA(G,w,s)
1. INITIALIZE-SINGLE-SOURCE(G,s)
2. S=
3. Q = G.V
4. while Q
5. u = Extract-Min(Q)
6. S = S U {u}
7. for each vertex v G.Adj[u]
8. RELAX(u,v,w)
𝑡 𝑥
1
1
0
9
𝑠 0 2 3 4 6
7
5
2 𝑧
𝑦
Dijkstra’s Algorithm
DIJKSTRA(G,w,s)
1. INITIALIZE-SINGLE-SOURCE(G,s)
2. S=
3. Q = G.V
4. while Q
S=
5. u = Extract-Min(Q)
6. S = S U {u}
7. for each vertex v G.Adj[u]
8. RELAX(u,v,w)
𝑡 𝑥
1
1
0
9
𝑠 0 2 3 4 6
7
5
2 𝑧
𝑦
Dijkstra’s Algorithm
DIJKSTRA(G,w,s)
1. INITIALIZE-SINGLE-SOURCE(G,s)
2. S=
3. Q = G.V
4. while Q
S=
5. u = Extract-Min(Q)
6. S = S U {u} Q G.V 𝒔 𝒕 𝒙 𝒚 𝒛
7. for each vertex v G.Adj[u] d 0
8. RELAX(u,v,w)
𝑡 𝑥
1
1
0
9
𝑠 0 2 3 4 6
7
5
2 𝑧
𝑦
Dijkstra’s Algorithm
DIJKSTRA(G,w,s)
1. INITIALIZE-SINGLE-SOURCE(G,s)
2. S=
3. Q = G.V
4. while Q
S={𝑠}
5. u = Extract-Min(Q)
6. S = S U {u} Q G.V 𝒕 𝒙 𝒚 𝒛
7. for each vertex v G.Adj[u] d
8. RELAX(u,v,w)
u=𝑠
G.adj[𝑠] = {𝑡, 𝑦}
𝑡 𝑥
1
1
0
9
𝑠 0 2 3 4 6
7
5
2 𝑧
𝑦
Dijkstra’s Algorithm
DIJKSTRA(G,w,s)
1. INITIALIZE-SINGLE-SOURCE(G,s)
2. S=
3. Q = G.V
4. while Q
S={𝑠}
5. u = Extract-Min(Q)
6. S = S U {u} Q G.V 𝒕 𝒙 𝒚 𝒛
7. for each vertex v G.Adj[u] d 10
8. RELAX(u,v,w)
u=𝑠
G.adj[𝑠] = {𝑡, 𝑦}
𝑡 𝑥
1
1 10
0
9
𝑠 0 2 3 4 6
7
5
2 𝑧
𝑦
Dijkstra’s Algorithm
DIJKSTRA(G,w,s)
1. INITIALIZE-SINGLE-SOURCE(G,s)
2. S=
3. Q = G.V
4. while Q
S={𝑠}
5. u = Extract-Min(Q)
6. S = S U {u} Q G.V 𝒕 𝒙 𝒚 𝒛
7. for each vertex v G.Adj[u] d 10 5
8. RELAX(u,v,w)
u=𝑠
G.adj[𝑠] = {𝑡, 𝑦}
𝑡 𝑥
1
1 10
0
9
𝑠 0 2 3 4 6
7
5
5
2 𝑧
𝑦
Dijkstra’s Algorithm
DIJKSTRA(G,w,s)
1. INITIALIZE-SINGLE-SOURCE(G,s)
2. S=
3. Q = G.V
4. while Q
S={𝑠, 𝑦}
5. u = Extract-Min(Q)
6. S = S U {u} Q G.V 𝒕 𝒙 𝒛
7. for each vertex v G.Adj[u] d 10
8. RELAX(u,v,w)
u=𝑦
G.adj[𝑦] = {𝑡, 𝑥, 𝑧}
𝑡 𝑥
1
1 10
0
9
𝑠 0 2 3 4 6
7
5
5
2 𝑧
𝑦
Dijkstra’s Algorithm
DIJKSTRA(G,w,s)
1. INITIALIZE-SINGLE-SOURCE(G,s)
2. S=
3. Q = G.V
4. while Q
S={𝑠, 𝑦}
5. u = Extract-Min(Q)
6. S = S U {u} Q G.V 𝒕 𝒙 𝒛
7. for each vertex v G.Adj[u] d 8
8. RELAX(u,v,w)
u=𝑦
G.adj[𝑦] = {𝑡, 𝑥, 𝑧}
𝑡 𝑥
1
1 8
0
9
𝑠 0 2 3 4 6
7
5
5
2 𝑧
𝑦
Dijkstra’s Algorithm
DIJKSTRA(G,w,s)
1. INITIALIZE-SINGLE-SOURCE(G,s)
2. S=
3. Q = G.V
4. while Q
S={𝑠, 𝑦}
5. u = Extract-Min(Q)
6. S = S U {u} Q G.V 𝒕 𝒙 𝒛
7. for each vertex v G.Adj[u] d 8 14
8. RELAX(u,v,w)
u=𝑦
G.adj[𝑦] = {𝑡, 𝑥, 𝑧}
𝑡 𝑥
1
1 8 14
0
9
𝑠 0 2 3 4 6
7
5
5
2 𝑧
𝑦
Dijkstra’s Algorithm
DIJKSTRA(G,w,s)
1. INITIALIZE-SINGLE-SOURCE(G,s)
2. S=
3. Q = G.V
4. while Q
S={𝑠, 𝑦}
5. u = Extract-Min(Q)
6. S = S U {u} Q G.V 𝒕 𝒙 𝒛
7. for each vertex v G.Adj[u] d 8 14 7
8. RELAX(u,v,w)
u=𝑦
G.adj[𝑦] = {𝑡, 𝑥, 𝑧}
𝑡 𝑥
1
1 8 14
0
9
𝑠 0 2 3 4 6
7
5
5 7
2 𝑧
𝑦
Dijkstra’s Algorithm
DIJKSTRA(G,w,s)
1. INITIALIZE-SINGLE-SOURCE(G,s)
2. S=
3. Q = G.V
4. while Q
S={𝑠, 𝑦, 𝑧}
5. u = Extract-Min(Q)
6. S = S U {u} Q G.V 𝒕 𝒙
7. for each vertex v G.Adj[u] d 8 14
8. RELAX(u,v,w)
u=𝑧
G.adj[𝑧] = {𝑥, s}
𝑡 𝑥
1
1 8 14
0
9
𝑠 0 2 3 4 6
7
5
5 7
2 𝑧
𝑦
Dijkstra’s Algorithm
DIJKSTRA(G,w,s)
1. INITIALIZE-SINGLE-SOURCE(G,s)
2. S=
3. Q = G.V
4. while Q
S={𝑠, 𝑦, 𝑧}
5. u = Extract-Min(Q)
6. S = S U {u} Q G.V 𝒕 𝒙
7. for each vertex v G.Adj[u] d 8 13
8. RELAX(u,v,w)
u=𝑧
G.adj[𝑧] = {𝑥, s}
𝑡 𝑥
1
1 8 13
0
9
𝑠 0 2 3 4 6
7
5
5 7
2 𝑧
𝑦
Dijkstra’s Algorithm
DIJKSTRA(G,w,s)
1. INITIALIZE-SINGLE-SOURCE(G,s)
2. S=
3. Q = G.V
4. while Q
S={𝑠, 𝑦, 𝑧}
5. u = Extract-Min(Q)
6. S = S U {u} Q G.V 𝒕 𝒙
7. for each vertex v G.Adj[u] d 8 13
8. RELAX(u,v,w)
u=𝑧
G.adj[𝑧] = {𝑥, s}
𝑡 𝑥
1
1 8 13
0
9
𝑠 0 2 3 4 6
7
5
5 7
2 𝑧
𝑦
Dijkstra’s Algorithm
DIJKSTRA(G,w,s)
1. INITIALIZE-SINGLE-SOURCE(G,s)
2. S=
3. Q = G.V
4. while Q
S={𝑠, 𝑦, 𝑧, 𝑡}
5. u = Extract-Min(Q)
6. S = S U {u} Q G.V 𝒙
7. for each vertex v G.Adj[u] d 13
8. RELAX(u,v,w)
u=𝑡
G.adj[𝑡] = {𝑥, 𝑦}
𝑡 𝑥
1
1 8 13
0
9
𝑠 0 2 3 4 6
7
5
5 7
2 𝑧
𝑦
Dijkstra’s Algorithm
DIJKSTRA(G,w,s)
1. INITIALIZE-SINGLE-SOURCE(G,s)
2. S=
3. Q = G.V
4. while Q
S={𝑠, 𝑦, 𝑧, 𝑡}
5. u = Extract-Min(Q)
6. S = S U {u} Q G.V 𝒙
7. for each vertex v G.Adj[u] d 9
8. RELAX(u,v,w)
u=𝑡
G.adj[𝑡] = {𝑥, 𝑦}
𝑡 𝑥
1
1 8 9
0
9
𝑠 0 2 3 4 6
7
5
5 7
2 𝑧
𝑦
Dijkstra’s Algorithm
DIJKSTRA(G,w,s)
1. INITIALIZE-SINGLE-SOURCE(G,s)
2. S=
3. Q = G.V
4. while Q
S={𝑠, 𝑦, 𝑧, 𝑡}
5. u = Extract-Min(Q)
6. S = S U {u} Q G.V 𝒙
7. for each vertex v G.Adj[u] d 9
8. RELAX(u,v,w)
u=𝑡
G.adj[𝑡] = {𝑥, 𝑦}
𝑡 𝑥
1
1 8 9
0
9
𝑠 0 2 3 4 6
7
5
5 7
2 𝑧
𝑦
Dijkstra’s Algorithm
DIJKSTRA(G,w,s)
1. INITIALIZE-SINGLE-SOURCE(G,s)
2. S=
3. Q = G.V
4. while Q
S={𝑠, 𝑦, 𝑧, 𝑡, 𝑥}
5. u = Extract-Min(Q)
6. S = S U {u} Q=
7. for each vertex v G.Adj[u]
8. RELAX(u,v,w)
u=𝑥
G.adj[𝑥] = {𝑧}
𝑡 𝑥
1
1 8 9
0
9
𝑠 0 2 3 4 6
7
5
5 7
2 𝑧
𝑦
Dijkstra’s Algorithm
DIJKSTRA(G,w,s)
1. INITIALIZE-SINGLE-SOURCE(G,s)
2. S=
3. Q = G.V
4. while Q
S={𝑠, 𝑦, 𝑧, 𝑡, 𝑥}
5. u = Extract-Min(Q)
6. S = S U {u} Q=
7. for each vertex v G.Adj[u]
8. RELAX(u,v,w)
u=𝑥
G.adj[𝑥] = {𝑧}
𝑡 𝑥
1
1 8 9
0
9
𝑠 0 2 3 4 6
7
5
5 7
2 𝑧
𝑦
Dijkstra’s Algorithm
DIJKSTRA(G,w,s)
1. INITIALIZE-SINGLE-SOURCE(G,s)
2. S=
3. Q = G.V
4. while Q
S={𝑠, 𝑦, 𝑧, 𝑡, 𝑥}
5. u = Extract-Min(Q)
6. S = S U {u} Q=
7. for each vertex v G.Adj[u]
8. RELAX(u,v,w)
𝑡 𝑥
1
1 8 9
0
9
𝑠 0 2 3 4 6
7
5
5 7
2 𝑧
𝑦
Dijkstra’s Algorithm
DIJKSTRA(G,w,s)
1. INITIALIZE-SINGLE-SOURCE(G,s)
2. S=
3. Q = G.V
4. while Q
S={𝑠, 𝑦, 𝑧, 𝑡, 𝑥}
5. u = Extract-Min(Q)
6. S = S U {u}
7. for each vertex v G.Adj[u]
8. RELAX(u,v,w)
𝑡 𝑥
1
1 8 9
0
9
𝑠 0 2 3 4 6
7
5
5 7
2 𝑧
𝑦
Running Time of Dijkstra’s Algorithm
It depends on implementations of the min-priority queue Q.
If we implement Q as a binary min-heap,
EXTRACT-MIN takes O(lg |V|) time.
DECREASE-KEY takes O(lg |V|) time.
If we implement Q as a simple array,
EXTRACT-MIN takes O(|V|) time.
DECREASE-KEY O(1) time.
If we implement Q as a Fibonacci heap,
EXTRACT-MIN takes O(lg |V|) amortized time.
DECREASE-KEY O(1) amortized time.
Dijkstra’s Algorithm
DIJKSTRA(G,w,s)
1. INITIALIZE-SINGLE-SOURCE(G,s)
2. S=
3. Q = G.V
4. while Q
5. u = Extract-Min(Q)
6. S = S U {u}
7. for each vertex v G.Adj[u]
8. RELAX(u,v,w)
Dijkstra’s Algorithm
min-priority queue : array
DIJKSTRA(G,w,s)
1. INITIALIZE-SINGLE-SOURCE(G,s) O(|V|)
2. S= O(1)
3. Q = G.V O(|V|)
4. while Q
5. u = Extract-Min(Q) O(|V|2)
6. S = S U {u} O(|V|)
7. for each vertex v G.Adj[u] O(|E|)
8. RELAX(u,v,w)
6. S = S U {u} O(|V|)
7. for each vertex v G.Adj[u] O(|E| lg |V|)
8. RELAX(u,v,w)
Running time:
O((|V|+|E|) lg |V|) , if all vertices are reachable O(|E| lg |V|).
Better than O(|V|2), if the graph is sufficiently sparse: |E|= o( |V|2 / lg |V|).
Dijkstra’s Algorithm
min-priority queue : Fibonacci heap
DIJKSTRA(G,w,s)
1. INITIALIZE-SINGLE-SOURCE(G,s) O(|V|)
2. S= O(1)
3. Q = G.V O(|V|)
4. while Q
5. u = Extract-Min(Q) O(|V| lg |V|)
6. S = S U {u} O(|V|)
7. for each vertex v G.Adj[u] O(|E|)
8. RELAX(u,v,w)
p2 u
s S
y
p1 x
Theorem 24.6 (Proof)
We can now obtain a contradiction to prove u.d= δ(s,u)
δ(s,y)≤δ(s,u) (∵ y appears before u on a shortest path from
s to u and all edge weights are non-negative)
y.d=δ(s,y)≤δ(s,u)≤u.d (by the upper-bound property)
But because both vertices u and y were in V-S when u was
chosen in line 5, u.d≤y.d
y.d=δ(s,y)=δ(s,u)=u.d
Consequently u.d=δ(s,u), which contradicts our choice of u.
u.d=δ(s,u) when u is added to S, and that this equality
is maintained at all times thereafter
Termination : At termination, Q={} which, along
with our earlier invariant that Q=V-S, implies that
S=V. u.d=δ(s,u) for all vertices u ∈V
Shortest-Path Algorithms
Bellman-Ford Dijkstra
Negative Edge O X
Positive Cycle O O
Negative Cycle X X