0% found this document useful (0 votes)
25 views54 pages

Graph

The document discusses graph algorithms including graph representations using adjacency matrices and lists, graph traversal algorithms like depth-first search and breadth-first search, topological sorting of directed acyclic graphs, and single-source shortest path algorithms on weighted graphs.

Uploaded by

Khaled Ahmed
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
25 views54 pages

Graph

The document discusses graph algorithms including graph representations using adjacency matrices and lists, graph traversal algorithms like depth-first search and breadth-first search, topological sorting of directed acyclic graphs, and single-source shortest path algorithms on weighted graphs.

Uploaded by

Khaled Ahmed
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 54

Graph Algorithms

• Sets and sequences can only model limited relations between objects, e.g. ordering,
overlapping, etc.
• Graphs can model more involved relationships, e.g. road and rail networks
• Graph: G = (V, E), V : set of vertices, E : set of edges
− Directed graph: an edge is an ordered pair of vertices, (v1, v2)
− Undirected graph; an edge is an unordered pair of vertices {v1, v2}

1
Graph representation
Adjacency matrix
Directed graph

V = {1, 2, 3, 4}
E = {(1, 2), (1, 3), (1, 4), (2, 3), (3, 4), (4, 2)}

2
1 2 3 4
1 0 1 1 1
2 0 0 1 0 1 3

3 0 0 0 1
4 0 1 0 0 4

2
Undirected graph

V = {1, 2, 3, 4}
E = {{1, 2}, {1, 3}, {1, 4}, {2, 3}, {2, 4}, {3, 4}}

2
1 2 3 4 1 2 3 4
1 0 1 1 1 1 0 1 1 1
2 1 0 1 1 or 2 0 1 1 1 3

3 1 1 0 1 3 0 1
4 1 1 1 0 4 0 4

Advantage: O(1) time to check connection.


Disadvantages:
– Space is O(|V |2) instead of O(|E|)
– Finding who a vertex (node) is connected to requires O(|V |) operations

3
Adjacency List
Example:

2 1 2 3 4

2 3
1 3
3 4

4 4 2

Example:

2 1 2 3 4

2 1 3 4
1 3
3 1 2 4

4 4 1 2 3

4
Advantages:
− easy to access all vertices connected to one vertex
− space is O(|E| + |V |)
Disadvantage:
− testing connection in worst case is O(|V |)
− space: |V | header, 2|E| list nodes =⇒ O(|V | + |E|). There might be |V |2 edges
(|E| = |V |2) but probably not.

5
Another representation
Adjacency list with arrays

2 1
2 1 1
3 2
2 4
4 3
1 3 3 5
3 4
4 6
4 5
4 5 7
2 6

• For node i, use header[i] and header[i + 1] − 1 as the indices in the list array.
If header[i] > header[i + 1] − 1 vertex i is not connected to any node.
• same advantage as adjacency list but save space
• binary search is possible to determine the connection: O(log|V |)
• problem: difficult to update the structure

6
Traversal of a graph
Depth First and Breadth First
Depth First (most useful)
var visited[1 . . . |V |]: boolean ←− f alse

P roc DFS(v);
(Given a graph G = (V, E) and a vertex v, visit each vertex reachable from v)

visited[v] ←− true
perform prework on vertex v
For each vertex w adjacent to v do
if not visited[w] then
DFS(w)
perform postwork on edge (v, w)
(sometimes we perform postwork on all edges out of v)

– given a vertex v, we need to know all vertices connected to v


– stack space ≈ |V | − 1
7
Complexity
1) With adjacency list
visited each vertex once
visited each edge twice; once from v to w, once from w to v.

O(|V | + |E|)

2) With adjacency matrix


visited each vertex once
for each vertex, visit all vertices connected to this vertex needs O(|V |) steps

O(|V |2)

Note: In graph, O(|E|) is better than O(|V |2) in most cases.

8
Examples

A B C
A
B A E C
1) DFS numbering B C
C A B D
Initially DF S num := 1 E D
C E F
Use DFS with following prework D

prework F E B D F
v.DF S := DF S num; D E
F
DF S num := DF S num+1;

2) DFS tree
A 1 A
Use DFS with following postwork
postwork: B 2 C 5 B C
add edge (v, w) to T
E 3 D 4 E D

F 6 F

9
Topological Sorting
Task scheduling
• A set of tasks. Some tasks depend on other tasks
• Task a depends on task b means that task a cannot be started until task b is
finished
• We want to find a schedule for tasks consistent with dependencies

Example: x → y: y cannot start until x is completed.


E
B
A C
D

ABCED ABCDE ABECD


are all schedule for tasks {A, B, C, D, E}.
This graph must be acyclic!

10
The problem
Given a directed acyclic graph G = (V, E) with n vertices, label the vertices from 1
to n such that, if v is labelled k, then all vertices that can be reached from v by a
directed path are labelled with labels > k.

In other words, label vertices from 1 to n such that for any edge (v, w) the label of
v is less than the label of w.

Lemma. A directed acyclic graph always contains a vertex with in-degree 0.


Proof. If all vertices have positive in-degrees, starting from any vertex v, traverse
the graph ”backward”. We never have to stop. But we only have a finite number of
vertices!
Consequently, there must be a cycle in the graph – a contradiction! (pigeonhole
principle).

11
Algorithm:
By induction:
find one vertex with in-degree 0. Label this vertex 1, and delete all edges from this
vertex to other vertices.
Now the new graph is also acyclic and is of size n − 1. By induction we know how
to label it.

Implementation.
1. Initialize in-degree of all vertices
2. Put all vertices with 0 in-degree into a queue or stack
l ←− 0
3. dequeue v; l ←− l + 1; v.label ←− l;
for all edge (v, w)
decrease in-degree of w by 1
if degree of w is now 0 enqueue w
until queue is empty

Time: O(|E| + |V |)

12
13
Single-Source Shortest-Paths

• Weighted graph
G = (V, E) directed graph with weights associated with the edges
• The weight of an edge (u, v) is w(u, v).
The weight of a path p =< v0, v1, · · · vk > is the summation of the weights of its
edges
X k
w(p) = w(vi−1, vi).
i=1

• We define the shortest-path weight from u to v by


½
min{w(p) : p is a path from u to v}
δ(u, v) =
∞ if there is no path from u to v

14
• The shortest path from u to v is defined as any path p from u to v with weight
w(p) = δ(u, v).
• The problem: Given the directed graph G = (V, E) and a vertex s, find the
shortest paths from s to all other vertices.
• For undirected graphs, change edge {u, v} with weight w to a pair of edges (u, v)
and (v, u) both with weight w.

Example:

-4
3 -1 2

8
4
3
S 6
5 8 -8
- 3

8
0 5 11

8
-3
2 3 7
- -
8

-6

15
• Negative weight cycle
In some instances of the single-source shortest-paths problem, there may be edges
with negative weights.
† If there is no negative cycle, the shortest path weight δ(s, v) is still well defined.
† If there is negative cycle reachable from s, then the shortest path weight from s
to any vertex on the cycle is not well defined.
† A lesser path can always be found by following the proposed ”shortest path”
and then traverse the negative weight cycle.
• Cycles in shortest path?
† A shortest path cannot contain a negative cycle.
Shortest path weight is not well defined.
† A shortest path cannot contain a positive cycle.
Removing the positive cycle will produce a path with lesser weight.
† How about 0-weight cycle?
We can remove all 0-weight cycles and produce a shortest path without cycle.
• We can assume that shortest paths we are looking for contain no cycle.
Therefore any shortest path contains at most |V | − 1 edges.

16
For each vertex v, we maintain two attributes, π[v] and d[v].
• d[v] is an upper bound on the weight of a shortest path from source s to v.
† During the execution of a shortest-path algorithm, d[v] may be larger than the
shortest-path weight.
† At the termination of a shortest-path algorithm, d[v] is the shortest-path weight
from s to v.
• π[v] is used to represent the shortest paths.
† During the execution of a shortest-path algorithm, π[] need not indicate shortest
paths.
† π[v] is the last edge of a path from s to v during the execution of a
shortest-path algorithm.
† At the termination of a shortest-path algorithm, π[v] represent the last edge of a
shortest path from s to v.
† Since sub-path of a shortest path is itself shortest path, therefore
< v, π[v], π[π[v]], · · · , s > is the shortest path from s to v in reverse order.

17
• Initialization
Initialize Single Source(G, s)
1 For each vertex v ∈ V [G] do
2 d[v] = ∞;
3 π[v] = nil;
4 d[s] = 0;

• Relaxation
Relax(u, v, w)
1 if d[v] > d[u] + w(u, v) then
2 d[v] = d[u] + w(u, v);
3 π[v] = u;

Relax(u, v, w) tests if we can improve the shortest path to v found so far by going
through u.
If so, we update d[v] and π[v].

18
• Each algorithm for single-source shortest-path will begin by calling
Initialize Single Source(G, s).
• And then Relax(u, v, w) will be repeatedly applied to edges.
• The algorithms differ in how many times they relax each edge and the order in
which they relax edges.

19
The Bellman-Ford Algorithm
Bellman-Ford algorithm solves the single-source shortest-path problem in general
case where graph may contains cycles and edge weights may be negative.
• If there is no negative cycle, the algorithm will compute the shortest-paths and
their weights.
• If there is negative cycle, the algorithm will report no solution exists.
• The idea is to repeatedly use the following procedure to progressively decrease an
estimate d[v] of the weight of shortest path from s to v.

Relax All(G, s)
1 For each edge (u, v) ∈ E do
2 Relax(u, v, w);

20
Lemma: Let p =< s = v0, v1, · · · , vk = v > be a path from s to v of length k and
weight w(p), then after k applications of Relax All(G, s), d[v] ≤ w(p).

Proof:
Prove by induction on k.
• k = 1.
In this case, p =< s, v > and w(p) = w(s, v). After Relax(s, v, w) is applied,
d[v] ≤ d[s] + w(s, v) = w(s, v) = w(p).
• k > 1.

† Let p1 =< v0, v1, · · · , vk−1 >, then p1 is a path of length k − 1.


† Therefore after k − 1 applications of Relax All(G, s), we have d[vk−1] ≤ w(p1).
† After another application of Relax All(G, s),
d[v] ≤ d[vk−1] + w(vk−1, vk ) ≤ w(p1) + w(vk−1, vk ) = w(p).
¤
Since shortest paths have lengths less than |V |, what we need to do is to apply
Relax All(G, s) |V | − 1 times.

21
Bellman Ford(G, w, s)
1 Initialize SingleSource(G, s)
2 for i := 1 to |V | − 1 do
3 for each edge (u, v) ∈ E do
4 Relax(u, v, w);
5 for each edge (u, v) ∈ E do
6 if d[v] > d[u] + w(u, v) then
7 return False;
8 return True;

22
Lines 5-7 test if the graph contains negative cycle reachable from s.
• If there is no such cycle, then there is no edge (u, v) ∈ E such that
d[v] > d[u] + w(u, v) since otherwise d[v] is not the shortest-path weight from s to
v.
• If
Pthere is such a cycle c =< v0, v1, · · · , vk > where v0 = vk and
k
i=1 w(vi−1 , vi ) < 0.

† Suppose that (for the purpose of contradiction) for each edge (u, v) ∈ E,
d[v] ≤ d[u] + w(u, v).
† Then d[vi] ≤ d[vi−1] + w(vi−1, vi) for 1 ≤ i ≤ k.
Pk Pk Pk
† And i=1 d[vi] ≤ i=1 d[vi−1] + i=1 w(vi−1, vi).
Pk
† Therefore i=1 w(vi−1, vi) ≥ 0
• Time complexity: O(|V ||E|).

23
Acyclic Graph

− Suppose that graph G has no cycle.


− We first use topological sorting to order the vertices of G.
• If s has label k, then for any vertex v with label < k, there is NO PATH from s
to v, so d[v] = ∞.
• We then consider each vertex with label > k in the order of k + 1, k + 2, · · · , |V |
• Consider a vertex v in the above order (with label > k).
We want to compute d[v] and π[v].
We need only consider those vertices u such that (u, v) is an edge in G.
For each (u, v) ∈ E[G] do
Relax(u, v, w)

• This is correct since for any (u, v) ∈ E, label for u is less the label for v.
• Complexity: O(|V | + |E|)

24
Non-Negative Weights

• General graph with no negative weight edge.


• Graph now is not acyclic. Therefore there is no topological order.
• What is the main idea from acyclic case?
When we consider shortest path from s to v, the topological order enables us
to ignore all vertices after v.
• Could we define an order for general graphs to do similar things?
• For general graphs,
Order the vertices by the weights of their shortest paths from s.
Unlike topological order, we do not know this order before we find shortest paths.

25
• We will find the order during the process of finding shortest paths.
• Can we first find the closest vertex w1?
Yes! w1 is the vertex satisfying following:

w(s, w1) = minv w(s, v)

Why?

Consider the shortest path from s to w1.


It must consist of only two vertices s and w1.
Otherwise if
s → v1 → v2 → · · · → vk → w1
is the shortest path from s to w1, then d[v1] = w(s, v1) ≤ δ(s, w1) = d[w1]
− either w1 is not closest – contradiction!
− or δ(s, w1) = δ(s, v1), we can choose v1 to be the closest vertex.
− therefore we can determine d[w1] and find w1 this way.

26
• Can we find the second closest vertex w2?
YES! The only paths we need to consider are the edges from s (except (s, w1)) and
paths of two edges, the first one being (s, w1), and the second one being from w1.
− Why? Again, consider a shortest path from s to w2
s → v1 → v2 → · · · → vk → w2
− Consider the first vertex (from s to w2) that is not s and w1.
− It is either v1 or v2 (and in this case v1 = w1).
− Therefore we choose the minimum of
w(s, v) (v 6= w1) or d[w1] + w(w1, v) (v 6= s).
− this give us w2 and d[w2].

27
Induction
Induction hypothesis:
Give graph G and a vertex s, we know the k − 1 vertices that are closest to s and
we know the weights of the shortest paths to them.

Base case: done!

Inductive Step: We want to find the kth (wk ) closest vertex and the weight of
shortest path to it.
Let the k − 1 closest vertices be w1, w2, . . . , wk−1.
Let Vk−1 = {s, w1, w2, . . . , wk−1}
The shortest path from s to wk can go only through vertices in Vk−1.
(If it goes through a vertex not in Vk−1, this vertex is closer than wk )

Therefore wk is the vertex satisfying the following:


wk 6∈ Vk−1 and the shortest path from s to wk through Vk−1 is less or equal to the
shortest path from s to any other vertex v 6∈ Vk−1 through Vk−1.

28
For v 6∈ Vk−1, let
d[v] = min (d[u] + w(u, v)).
u∈Vk−1

d[v] is the shortest path from s to v through Vk−1.


Therefore wk is a vertex such that
wk 6∈ Vk−1 and d[wk ] = min {d[v]}.
v6∈Vk−1

• Adding wk does not change the weights of the shortest paths from s to u,
u ∈ Vk−1, since u is closer than wk
• The Algorithm is complete now.
We should consider how to implement it efficiently.

The main computation is for d[v] for v 6∈ Vk−1.

29
• We do not have to compute all d[v] for each Vk .

Most of d[v] for Vk are equal to d[v] for Vk−1.


We only need to update a few d[v] when we add wk .

• When we add wk
For v, such that v 6∈ Vk and (wk , v) is an edge.
d[v] = min{d[v], d[wk ] + w(wk , v)}

(Note: this is the same as Relax(wk , v, w).)

Consider a shortest path from s to v through Vk .


If the last edge is (wi, v), i < k, then there is no change to d[v].
If the last edge is (wk , v) then d[v] = d[wk ] + w(wk , v).
V

Wi
Blue: V k-1

S Wk Green: V k

30
What data structure should we use?

Heap is a good choice!


• We can keep d[v] in a min heap. Then we can find wk in O(1) time.
• After we find wk , we update d[v].
− Delete wk from heap.
− For each v in the heap such that (wk , v) is an edge, change its key from d[v] to
min{d[v], d[wk ] + w(wk , v)} (Relax(wk , v, w)).
• We need to use the heap with element locations (see notes for heap)!

31
Dijkstra’s Algorithm
The above analysis gives us the Dijkstra’s algorithm.
Dijkstra(G, w, s)
1 Initialize Single Source(G, s);
2 S := ∅;
3 Q := V [G];
4 while Q 6= ∅ do
5 u := Extract M in(Q);
6 S := S ∪ {u};
7 for each (u, v) ∈ E do
8 Relax(u, v, w);
9 Update v in Q;

32
Time Complexity
With a binary heap:
|V | delete min operations: O(|V | log(|V |))
|E| update operations: O(|E| log(|V |))
TOTAL O((|V | + |E|) log(|V |))

With a Fibonacci heap:


|V | delete min operations: O(|V | log(|V |))
|E| update operations: O(|E|)
TOTAL O(|V | log(|V |) + |E|)

Without a heap:
|V | delete min operations: O(|V ||V |)
|E| update operations: O(|E|)
TOTAL O(|V |2 + |E|) = O(|V |2)

(Compare with acyclic case O(|V | + |E|))


(Compare with Bellman-Ford algorithm O(|V ||E|))

33
Minimum Spanning Trees

• Consider an undirected weighted graph G = (V, E).


• A spanning tree of G is a connected subgraph that contains all vertices and no
cycles.
• Minimum spanning tree of G: a spanning tree T of G such that the sum of the
weights of edges in T is minimum.
• Applications:
− computer networks (e.g. broadcast path)
− there is a cost for sending a message on the link.
− broadcast a message to all computers in the network from an arbitrary computer
− want to minimize the cost

34
The Problem
Given an undirected connected weighted graph G = (V, E), find a spanning tree T
of G of minimum cost.

Idea.
Extend tree: always choose to extend tree by adding cheapest edge.

For simplicity, we assume all costs (weights) are distinct!

Base case: Let r be an arbitrarily chosen root vertex. The minimum-cost edge
incident to r must be in the minimum spanning tree (MST)
† Suppose this edge is {r, s}
† if {r, s} is not in MST, add {r, s} to MST
† Now we have a cycle
† Delete the MST edge incident to r from the cycle. We have a new tree.
† the cost of this new tree is less than the cost of MST. Contradiction!

35
Induction hypothesis
Given a connected graph G = (V, E), we know how to find a subgraph T of G with
k edges, such that T is a tree and T is a subgraph of the MST of G.

Extend T :
† Find the cheapest edge from a vertex in T to a vertex not in T . Let it be {u, v},
such that u ∈ T and v 6∈ T .
† Add {u, v} to T .
† Claim: We now have a tree with k + 1 edges which is a subgraph of the MST of G.
• Again add {u, v} to the MST
• Consider the path from u to v in MST
• There must be an edge e = {u1, v1} in this path such that u1 ∈ T and v1 6∈ T .
• Delete edge e
• Since weight(e) > weight({u, v}), the new tree has a cost less than the MST
• Contradiction

36
Implementation

• Similar to the implementation of single-source shortest-path algorithm


• Choose an arbitrary vetex as the root
• For each iteration we need to find the minimum cost edge connecting T to vertices
outside of T .
• We again use a heap.
For each vertex w not in T , we use the minimum-cost of the costs of the edges
going into w from a vertex in T as the key.
• For each iteration we delete min from the heap. Suppose u is the new vertex.
Update the keys for vertex v not in T by cost of edge {u, v}.
• Time: |V | delete min: O(|V | log(|V |))
|E| update operations: O(|E| log(|V |))
Total: O((|V | + |E|) log(|V |))
• This is called PRIMS algorithm

37
Prim’s Algorithm
The above analysis gives us the Prim’s algorithm.
MST Prim(G, w, r)
1 for each u ∈ V [G] do
2 key[u] := ∞;
3 π[u] := NIL;
4 key[r] := 0;
5 Q := V [G];
6 while Q 6= ∅ do
7 u := Extract Min(Q);
8 for each v ∈ Adj[u] do
9 if v ∈ Q and w(u, v) < key[v] then
10 π[v] := u;
11 key[v] := w(u, v);
12 update key[v] in Q

38
Kruskal’s MST
Idea: Choose cheapest edge in a graph.

Algorithm:
put all edges in a heap, put each vertex in a set by itself;
while not found a MST yet do begin
delete min edge, {u, v}, from the heap;
if u and v are not in the same set
mark {u, v} as tree edge;
union sets containing u and v;
if u and v are in the same set
do nothing;
end

Time:
O((|V | + |E|) log(|V |)) for heap operation.
O(|E| log∗(|V |) for union-find operation.
Total: O((|V | + |E|) log(|V |)) time.

39
All-Pair Shortest-Paths Problem

• The problem: Given a weighted graph G = (V, E), find the shortest paths between
all pairs of vertices.
• We can call single-source shortest-paths algorithm |V | times
† If there is no negative cycle.
Complexity: O(|V |2|E|)
† If there is no negative weight edge.
Complexity: O(|V |2 log(|V |) + |V ||E|) or O(|V |(|V | + |E|) log(|V |))
If G is not dense, this is a good solution.
• We consider to use induction to design a direct solution.

40
• We can use induction on the vertices.
• We know the shortest paths between a set of k vertices (Vk ).
• We want to add a new vertex u
• We can find the shortest path from u to all the vertices in Vk
shortest-path(u, w) =
minv∈VK ,(u,v)∈E {w(u, v)+shortest-path(v, w)}(∗)

Shortest-path(w, u) can be computed similarly!

We update shortest-path(w1, w2), w1, w2 ∈ Vk

shortest-path(w1, w2) = min{shortest-path(w1, u)+ shortest-path(u, w2),


shortest-path(w1, w2)} (**)

Time: (**) can be done in |V |2


(*) can be done in |V |2

Total: O(|V |3).

41
A better solution

− Idea: Number of vertices is fixed.


Induction puts restrictions on the type of paths allowed
− We label vertices from 1 to |V |
A path from u to w is called a k-path if, except for u and w, the highest-labelled
vertex on the path is labelled by k.
A 0-path is an edge
− Induction hypothesis:
We know the lengths of the shortest paths between all pairs of vertices such that
only k-paths, for some k ≤ m are considered.
− Base case: m = 0
only direct edges can be considered

42
Inductive step
(extend m − 1 to m)

We consider all k-paths such that k ≤ m.


The only new paths are m-paths.
Let the vertex with label m be vm.
Consider a shortest m-path between u and v.

This m-path must include vm only once!

Therefore this m-path is a shortest k-path (for some k ≤ m − 1) between u and vm


appended by a shortest j-path (for some j ≤ m − 1) from vm to v.
By induction we already know the length of the k-path and the j-path!
We update shortest-path (u, v) by:

min{shortest-path(u, vm) + shortest-path(vm, v), shortest-path(u, v)}

43
This leads to a very simple program! (Floyd-Warshall algorithm)

for x := 1 to |V | do { base case }


for y := 1 to |V | do
if (x, y) ∈ E, then
d[x, y] := w(x, y);
else
d[x, y] := ∞;

for x := 1 to |V | do
d[x, x] := 0;

for m := 1 to |V | do { the induction sequence }


for x := 1 to |V | do
for y := 1 to |V | do
if d[x, m] + d[m, y] < d[x, y] then
d[x, y] := d[x, m] + d[m, y]

Time: O(|V |3). Again, if the graph is sparse, then O(|V |2 log(|V |) + |V ||E|) is a
better solution when there is no negative weight.

44
If we need to find the shortest paths not just the weights. Let φ[i, j] be highest
numbered vertex on the shortest path from i to j.

for x := 1 to |V | do { base case }


for y := 1 to |V | do
if (x, y) ∈ E, then
d[x, y] := w(x, y); φ[x, y] := x;
else
d[x, y] := ∞; φ[x, y] :=Nil;
for x := 1 to |V | do
d[x, x] := 0; φ[x, x] :=Nil;
for m := 1 to |V | do { the induction sequence }
for x := 1 to |V | do
for y := 1 to |V | do
if d[x, m] + d[m, y] < d[x, y] then
d[x, y] := d[x, m] + d[m, y];
φ[x, y] := m;

Time: O(|V |3)

45
If we need to find the shortest paths not just the weights. Let π[i, j] be the
predecessor of j on the shortest path from i to j.

for x := 1 to |V | do { base case }


for y := 1 to |V | do
if (x, y) ∈ E, then
d[x, y] := w(x, y); π[x, y] := x;
else
d[x, y] := ∞; π[x, y] :=Nil;
for x := 1 to |V | do
d[x, x] := 0; π[x, x] :=Nil;
for m := 1 to |V | do { the induction sequence }
for x := 1 to |V | do
for y := 1 to |V | do
if d[x, m] + d[m, y] < d[x, y] then
d[x, y] := d[x, m] + d[m, y];
π[x, y] := π[m, y];

Time: O(|V |3)

46
Example: Figure 25.1.

2
3 4

1 3
2 8

-4 1
7 -5

5 4
6

47
   
0 3 8 ∞ −4 NIL 1 1 NIL 1
∞ 0 ∞ 1 7   NIL NIL NIL 2 2 
D(0) Φ(0)
   
∞
= 4 0 ∞ ∞ =  NIL 3 NIL NIL NIL 

 
 2 ∞ −5 0 ∞  4 NIL 4 NIL NIL 
∞ ∞ ∞ 6 0 NIL NIL NIL 5 NIL

   
0 3 8 ∞ −4 NIL 1 1 NIL 1
∞ 0 ∞ 1 7   NIL NIL NIL 2 2 
D(1) Φ(1)
   
∞
= 4 0 ∞ ∞ =  NIL 3 NIL NIL NIL 

 
 2 5 −5 0 −2   4 1 4 NIL 1 
∞ ∞ ∞ 6 0 NIL NIL NIL 5 NIL

   
0 3 8 4 −4 NIL 1 1 2 1
∞ 0 ∞ 1 7   NIL NIL NIL 2 2 
D(2) Φ(2)
   
∞
= 4 0 5 11  =  NIL 3 NIL 2 2 

 
 2 5 −5 0 −2   4 1 4 NIL 1 
∞ ∞ ∞ 6 0 NIL NIL NIL 5 NIL

48
   
0 3 8 4 −4 NIL 1 1 2 1
∞ 0 ∞ 1 7   NIL NIL NIL 2 2 
D(3) Φ(3)
   
∞
= 4 0 5 11  =  NIL 3 NIL 2 2 

 
 2 −1 −5 0 −2   4 3 4 NIL 1 
∞ ∞ ∞ 6 0 NIL NIL NIL 5 NIL

   
0 3 −1 4 −4 NIL 1 4 2 1
3 0 −4 1 −1   4 NIL 4 2 4 
D(4) Φ(4)
   
7
= 4 0 5 3  = 4 3 NIL 2 4 

 
2 −1 −5 0 −2   4 3 4 NIL 1 
8 5 1 6 0 4 4 4 5 NIL

   
0 1 −3 2 −4 NIL 5 5 5 1
3 0 −4 1 −1   4 NIL 4 2 1 
D(5) Φ(5)
   
7
= 4 0 5 3  = 4 3 NIL 2 1 

 
2 −1 −5 0 −2   4 3 4 NIL 1 
8 5 1 6 0 4 3 4 5 NIL

49
   
0 3 8 ∞ −4 NIL 1 1 NIL 1
∞ 0 ∞ 1 7   NIL NIL NIL 2 2 
D(0) Π(0)
   
∞
= 4 0 ∞ ∞ =  NIL 3 NIL NIL NIL 

 
 2 ∞ −5 0 ∞  4 NIL 4 NIL NIL 
∞ ∞ ∞ 6 0 NIL NIL NIL 5 NIL

   
0 3 8 ∞ −4 NIL 1 1 NIL 1
∞ 0 ∞ 1 7   NIL NIL NIL 2 2 
D(1) Π(1)
   
∞
= 4 0 ∞ ∞ =  NIL 3 NIL NIL NIL 

 
 2 5 −5 0 −2   4 1 4 NIL 1 
∞ ∞ ∞ 6 0 NIL NIL NIL 5 NIL

   
0 3 8 4 −4 NIL 1 1 2 1
∞ 0 ∞ 1 7   NIL NIL NIL 2 2 
D(2) Π(2)
   
∞
= 4 0 5 11  =  NIL 3 NIL 2 2 

 
 2 5 −5 0 −2   4 1 4 NIL 1 
∞ ∞ ∞ 6 0 NIL NIL NIL 5 NIL

50
   
0 3 8 4 −4 NIL 1 1 2 1
∞ 0 ∞ 1 7   NIL NIL NIL 2 2 
D(3) Π(3)
   
∞
= 4 0 5 11  =  NIL 3 NIL 2 2 

 
 2 −1 −5 0 −2   4 3 4 NIL 1 
∞ ∞ ∞ 6 0 NIL NIL NIL 5 NIL

   
0 3 −1 4 −4 NIL 1 4 2 1
3 0 −4 1 −1   4 NIL 4 2 1 
D(4) Π(4)
   
7
= 4 0 5 3  = 4 3 NIL 2 1 

 
2 −1 −5 0 −2   4 3 4 NIL 1 
8 5 1 6 0 4 3 4 5 NIL

   
0 1 −3 2 −4 NIL 3 4 5 1
3 0 −4 1 −1   4 NIL 4 2 1 
D(5) Π(5)
   
7
= 4 0 5 3  = 4 3 NIL 2 1 

 
2 −1 −5 0 −2   4 3 4 NIL 1 
8 5 1 6 0 4 3 4 5 NIL

51
If we need to find the shortest paths and shortest cycles, let π[i, j] be the
predecessor of j on the shortest path from i to j.

for x := 1 to |V | do { base case }


for y := 1 to |V | do
if (x, y) ∈ E, then
d[x, y] := w(x, y); π[x, y] := x;
else
d[x, y] := ∞; π[x, y] :=Nil;
for m := 1 to |V | do { the induction sequence }
for x := 1 to |V | do
for y := 1 to |V | do
if d[x, m] + d[m, y] < d[x, y] then
d[x, y] := d[x, m] + d[m, y];
π[x, y] := π[m, y];

Time: O(|V |3)

52
   
∞ 3 8 ∞ −4 NIL 1 1 NIL 1
∞ ∞ ∞ 1 7   NIL NIL NIL 2 2 
D(0) Π(0)
   
∞
= 4 ∞ ∞ ∞ =  NIL 3 NIL NIL NIL 

 
 2 ∞ −5 ∞ ∞  4 NIL 4 NIL NIL 
∞ ∞ ∞ 6 ∞ NIL NIL NIL 5 NIL

   
∞ 3 8 ∞ −4 NIL 1 1 NIL 1
∞ ∞ ∞ 1 7   NIL NIL NIL 2 2 
D(1) Π(1)
   
∞
= 4 ∞ ∞ ∞ =  NIL 3 NIL NIL NIL 

 
 2 5 −5 ∞ −2   4 1 4 NIL 1 
∞ ∞ ∞ 6 ∞ NIL NIL NIL 5 NIL

   
∞ 3 8 4 −4 NIL 1 1 2 1
∞ ∞ ∞ 1 7   NIL NIL NIL 2 2 
D(2) Π(2)
   
∞
= 4 ∞ 5 11  =  NIL 3 NIL 2 2 

 
 2 5 −5 6 −2   4 1 4 2 1 
∞ ∞ ∞ 6 ∞ NIL NIL NIL 5 NIL

53
   
∞ 3 8 4 −4 NIL 1 1 2 1
∞ ∞ ∞ 1 7   NIL NIL NIL 2 2 
D(3) Π(3)
   
∞
= 4 ∞ 5 11  =  NIL 3 NIL 2 2 

 
 2 −1 −5 0 −2   4 3 4 2 1 
∞ ∞ ∞ 6 ∞ NIL NIL NIL 5 NIL

   
6 3 −1 4 −4 4 1 4 2 1
3 0 −4 1 −1  4 3 4 2 1
D(4) Π(4)
   
7
= 4 0 5 3 
 4
= 3 4 2 1
2 −1 −5 0 −2  4 3 4 2 1
8 5 1 6 4 4 3 4 5 1

   
4 1 −3 2 −4 4 3 4 5 1
3 0 −4 1 −1  4 3 4 2 1
D(5) Π(5)
   
7
= 4 0 5 3 
 4
= 3 4 2 1
2 −1 −5 0 −2  4 3 4 2 1
8 5 1 6 4 4 3 4 5 1

54

You might also like