You are on page 1of 22

Algorithm Course Notes

Dynamic Programming 4
Dr. K V Arya
ABV- IIITM ,Gwalior

Summary
Dynamic programming applied to

All pairs shortest path problem ( Floyds

Algorithm )

Transitive closure (Warshalls Algorithm)

Constructing solutions using dynamic programming

All pairs shortest path problem


Matrix product.

Graphs
A graph is an ordered pair G = ( V , E) where
V is a finite set of vertices

E V * V is a set of edges

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

Directed Graphs
A directed graph is a graph with directions on the edges.
For example,

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

Labeled , Directed Graphs


A labeled directed graph is a directed graph with positive costs

on the edges.

10

100

30

10

50

60
20

Applications : cities and distances by road.


Conventions: n is the number of vertices

e is the number of edges

Paths in Graphs
A path in a graph G = ( V,E) is a sequence of edges
(v1, v2), (v2,v3) ,,(vn,vn+1)

The length of a path is the number of edges.


The cost of a path is the sum of the cost of the edges.

For example , (1,2) , (2,3) ,(3,5) . Length 3 . Cost 70.

10
2

100
5

30
10

50

60

4
20

All pair shortest Paths


Given a labeled, directed graph G = (V,E) , find for each pair of
vertices v, w V the cost of the shortest ( i.e. least cost ) path
from v to w.
Define Ak to be an n * n matrix with A k [i ,j] the cost of the

shortest path from i to j with internal vertices numbered k.


A 0 [i ,j] equals

If i j and (i,j) E, then the cost of the edge from i to j.


If i j and (i,j) E, then

If i=j , then 0.

Computing A k

Consider the shortest path from i to j with internal vertices

1.k. Either:

It does not go through k, in which place it costs A k-1 [i,j].


It goes through k, in which case it goes through k only
once, so it costs A k-1 [i,k] + A k-1 [k,j].
(only true for positive costs).

Vertices numbered at most k-1

Computing A k

Hence,

A k [i, j] = min {A k-1 [i , j] , A k- 1 [i , k] + A k- 1 [k , j]}


A k-1
i

Ak

All entries in A k depend upon row k and column k of A k-1

Computing A k
The entries in row k and column k of A k are the same as those in
A k-1.
Row k:

A k[ k ,j] := min {A k-1 [ k ,j] , A k-1 [ k ,k] + A k-1 [ k ,j] }


= min{A k-1 [ k ,j] ,0 + A k-1 [ k ,j] }
Column k:

A k [ i ,k] := min{A k-1 [ i ,k] , A k-1 [ i ,k] + A k-1 [ k ,k]}


= min{A k-1 [ i ,k], A k-1 [ i ,k] + 0}
= A k-1 [ i ,k]

Therefore, we can use the same array.

Floyds Algorithm
for i:=1 to n do
for j:=1 to n do

if (i, j) E
then A[i ,j] := cost of (i, j)
else A[i ,j] :=

A[i ,j] := 0
for k:=1 to n do
for i:=1 to n do
for j:=1 to n do

if A[i ,k ]+ a[k , j] < A[i ,j ] then


A[i , j] := A[ i , k] + A[ k , j]

Running time: O(n3)

Example
1

10

100
30

10

50

60

4
20

Example

Storing the Shortest Path


for i:=1 to n do

for j:=1 to n do
P [ i, j ] := 0

if (i, j) E

then A[i ,j] := cost of (i, j)


else A[i ,j] :=

A[i ,j] := 0
for k:=1 to n do

Running time : O(n3)


on termination P[i ,j] contains
vertex on the shortest path from i to j

for i:=1 to n do

for j:=1 to n do
if A[i ,k ]+ A[k , j] < A[i ,j ] then
A[i , j] := A[ i , k] + A[ k , j]
P [ i, j ] := k

Computing the Shortest path


for i := 1 to n do
for j := 1 to n do
if A[ i, j] < then
print( i) ; shortest ( i ,j) ; print (j )

Procedure shortest ( I, j)
k: = P [ i, j]
if k > 0 then
shortest ( i , k); print ( k) ; shortest ( k , j)

Correctness of Shortest (i ,j)


Claim : Calling procedure shortest(i ,j) prints the internal nodes
on the shortest path from i to j.

Proof: A simple induction on the length of the path.


Warshalls algorithm
Transitive Closure: given a directed graph G = (V ,E) , find for

each pair of vertices v, w V whether there is a path from v to w.


Solution: make the cost of all edges 1, and run Floyds algorithm .
If on termination A[ i, j] , then there is a path from i to j.

A cleaner solution : use Boolean values instead

Warshalls Algorithm
for i := 1 to n do
for j := 1 to n do
A[ i, j] := (i,j) E
A[ i, i] := true

for k:= 1 to n do
for i:= 1 to n do
for j:= 1 to n do
A[ i, j] := A[ i, j] or (A[i, k] and A[ k, j])

Finding Solutions using Dynamic


Programming
We have seen some examples of finding the cost of the
best solution to some interesting problems:

Cheapest order of multiplying n rectangular matrices.


Min cost binary search tree
All pairs shortest path

We have also seen some examples of finding whether


solutions exist to some interesting problems:

The knapsack problem


Transitive closure

Finding Solutions using Dynamic


Programming
What about actually finding the solutions?
We saw how to do it with the all pairs shortest path

problem.
The principle is the same every time:

In the inner loop there is some kind of decision taken.


Record the result of this decision in another table.

Write a divide-and-conquer algorithm to construct the


solution from the information in the table.

Matrix Product
As another example , consider the matrix product
algorithm.
for i := 1 to n do m [ i,i ] := 0
for d := 1 to n-1 do

for i := 1 to n-d do
j := i + d
m [i , j] := min i k < j ( m[ i, k] + m[k+1, j] + ri-1 r k r j )

Matrix Product

In more detail:

for i := 1 to n do m [ i,i ] := 0

for d := 1 to n-1 do
for i := 1 to n-d do
j := i + d
m [i , j] := m [i , i] + m [i+1 , j] + ri-1 r i r j

for k := i +1 to j-1 do
if m [i , k] + m [k+1 , j] + ri-1 r k r j < m [i , j]
then
m [i , j] := m [i , k] + m [k+1 , j] + ri-1 r k r j

Matrix Product
Add the extra lines :

for i := 1 to n do m [ i,i ] := 0
for d := 1 to n-1 do

for i := 1 to n-d do
j := i + d
m [i , j] := m [i , i] + m [i+1 , j] + ri-1 r i r j
P [ i, j ] := i

for k := i +1 to j-1 do

if m [i , k] + m [k+1 , j] + ri-1 r k r j < m [i , j]


then

m [i , j] := m [i , k] + m [k+1 , j] + ri-1 r k r j
P [ i, j ] := k

You might also like