Graphs2 slides.v4

Graphs: MSTs
and Shortest Paths
David Kauchak
cs161
Summer 2009
Administrative

Grading




TA issues/concerns
HW6




final grade
extra credit
shorter
will be due Wed. 8/12 before class
Errors in class slides and notes
Anonymized scores posted
Shortest paths

What is the shortest path from a to d?
B
D
C
E
A
Shortest paths

BFS
B
D
C
E
A
Shortest paths

What is the shortest path from a to d?
B
2
D
3
3
2
1
A
1
C
E
4
Shortest paths

We can still use BFS
B
2
D
3
3
2
1
A
1
C
E
4
Shortest paths

We can still use BFS
B
2
D
B
D
C
E
3
3
2
1
A
1
C
E
4
A
Shortest paths

We can still use BFS
B
D
C
E
A
Shortest paths

What is the problem?
B
D
C
E
A
Shortest paths

Running time is dependent on the weights
B
B
100
2
1
A
4
C
50
A
200
C
Shortest paths
B
B
100
50
A
200
A
C
C
Shortest paths
B
A
C
Shortest paths
B
A
C
Shortest paths

Nothing will change as we expand the frontier
until we’ve gone out 100 levels
B
A
C
Dijkstra’s algorithm
Dijkstra’s algorithm
Dijkstra’s algorithm
prev keeps track of
the shortest path
Dijkstra’s algorithm
Dijkstra’s algorithm
Dijkstra’s algorithm
Single source shortest paths


All of the shortest path algorithms we’ll look
at today are call “single source shortest
paths” algorithms
Why?
B
3
D
3
1
2
1
A
1
C
E
4


3
B

D
3
1
1
A
1

2
E 
C
4
Heap

A
B
C
D
E

3
B
D
3
0
1
1
A
1

2
E 
C
4
0




Heap

B
C
D
E

3
B
D
3
0
1
1
A
1

2
E 
C
4




Heap

B
C
D
E

3
B
D
3
0
1
1
A
1

2
E 
C
4




Heap

C
B
D
E

3
B
D
3
0
1
1
A
1
1
2
E 
C
4
1



Heap

C
B
D
E

3
B
D
3
0
1
1
A
1
1
2
E 
C
4
1



Heap
C
B
D
E

3
3
B
D
3
0
1
1
A
1
1
2
E 
C
4
1
3


Heap
C
B
D
E

3
3
B
D
3
0
1
1
A
1
1
2
E 
C
4
1
3


Heap
B 3
D 
E 

3
3
B
D
3
0
1
1
A
1
1
2
E 
C
4
Heap
B 3
D 
E 

3
3
B
D
3
0
1
1
A
1
1
2
E 
C
4
Heap
B 3
D 
E 

3
3
B
D
3
0
1
1
A
1
1
2
E 
C
4
Heap
B 2
D 
E 

2
3
B
D
3
0
1
1
A
1
1
2
E 
C
4
Heap
B 2
D 
E 

2
3
B
D
3
0
1
1
A
1
1
2
E 
C
4
Heap
B 2
E 5
D 

2
3
B
D
3
0
1
1
A
1
1
2
E 5
C
4
Heap
B 2
E 5
D 

2
3
B
D
3
0
1
1
A
1
1
2
E 5
C
4
Frontier?
Heap
B 2
E 5
D 

2
3
B
D
3
0
1
1
A
1
1
2
E 5
C
4
All nodes reachable
from starting node
within a given distance
Heap
E 3
D 5
2
5
3
B
D
3
0
1
1
A
1
1
2
E 3
C
4
Heap
D 5
2
5
3
B
D
3
0
1
1
A
1
1
2
E 3
C
4
Heap
2
5
3
B
D
3
0
1
1
A
1
1
2
E 3
C
4
Heap
2
3
B
5
D
0
1
1
A
1
1
C
E 3
Is Dijkstra’s algorithm correct?

Invariant:
Is Dijkstra’s algorithm correct?

Invariant: For every vertex removed from the heap,
dist[v] is the actual shortest distance from s to v
Is Dijkstra’s algorithm correct?

Invariant: For every vertex removed from the
heap, dist[v] is the actual shortest distance
from s to v


The only time a vertex gets visited is when the
distance from s to that vertex is smaller than the
distance to any remaining vertex
Therefore, there cannot be any other path that
hasn’t been visited already that would result in a
shorter path
Running time?
Running time?
1 call to MakeHeap
Running time?
|V| iterations
Running time?
|V| calls
Running time?
O(|E|) calls
Running time?

Depends on the heap implementation
1 MakeHeap
|V| ExtractMin
|E| DecreaseKey
Array
O(|V|)
O(|V|2)
O(|E|)
Bin heap
O(|V|)
O(|V| log |V|)
O(|E| log |V|)
Total
O(|V|2)
O((|V|+|E|) log |V|)
O(|E| log |V|)
Running time?

Depends on the heap implementation
1 MakeHeap
|V| ExtractMin
|E| DecreaseKey
Array
O(|V|)
O(|V|2)
O(|E|)
Bin heap
O(|V|)
O(|V| log |V|)
O(|E| log |V|)
Total
O(|V|2)
O((|V|+|E|) log |V|)
O(|E| log |V|)
Is this an improvement?
If |E| < |V|2 / log |V|
Running time?

Depends on the heap implementation
1 MakeHeap
|V| ExtractMin
|E| DecreaseKey
Array
O(|V|)
O(|V|2)
O(|E|)
Bin heap
O(|V|)
O(|V| log |V|)
O(|E| log |V|)
Total
O(|V|2)
O((|V|+|E|) log |V|)
O(|E| log |V|)
Fib heap
O(|V|)
O(|V| log |V|)
O(|E|)
O(|V| log |V| + |E|)
What about Dijkstra’s on…?
1
B
1
A
D
5
10
-10
C
E
What about Dijkstra’s on…?
1
B
1
A
D
5
10
-10
C
E
What about Dijkstra’s on…?
Dijkstra’s algorithm only works
for positive edge weights
1
B
1
A
D
5
10
C
E
Bounding the distance

Another invariant: For each vertex v, dist[v] is
an upper bound on the actual shortest
distance



start of at 
only update the value if we find a shorter distance
An update procedure
dist [v]  min{ dist [v], dist [u ]  w(u, v)}
dist [v]  min{ dist [v], dist [u ]  w(u, v)}

Can we ever go wrong applying this update
rule?


We can apply this rule as many times as we want
and will never underestimate dist[v]
When will dist[v] be right?

If u is along the shortest path to v and dist[u] is
correct
dist [v]  min{ dist [v], dist [u ]  w(u, v)}


dist[v] will be right if u is along the shortest
path to v and dist[u] is correct
Consider the shortest path from s to v
s
p1
p2
p3
pk
v
dist [v]  min{ dist [v], dist [u ]  w(u, v)}


dist[v] will be right if u is along the shortest
path to v and dist[u] is correct
What happens if we update all of the vertices
with the above update?
s
p1
p2
p3
pk
v
dist [v]  min{ dist [v], dist [u ]  w(u, v)}


dist[v] will be right if u is along the shortest
path to v and dist[u] is correct
What happens if we update all of the vertices
with the above update?
s
correct
p1
p2
p3
pk
v
dist [v]  min{ dist [v], dist [u ]  w(u, v)}


dist[v] will be right if u is along the shortest
path to v and dist[u] is correct
What happens if we update all of the vertices
with the above update?
s
p1
correct
correct
p2
p3
pk
v
dist [v]  min{ dist [v], dist [u ]  w(u, v)}


dist[v] will be right if u is along the shortest
path to v and dist[u] is correct
Does the order that we update the vertices
matter?
s
p1
correct
correct
p2
p3
pk
v
dist [v]  min{ dist [v], dist [u ]  w(u, v)}


dist[v] will be right if u is along the shortest path to v
and dist[u] is correct
How many times do we have to do this for vertex pi
to have the correct shortest path from s?

s
i times
p1
p2
p3
pk
v
dist [v]  min{ dist [v], dist [u ]  w(u, v)}


dist[v] will be right if u is along the shortest path to v
and dist[u] is correct
How many times do we have to do this for vertex pi
to have the correct shortest path from s?

i times
s
p1
correct
correct
p2
p3
pk
v
dist [v]  min{ dist [v], dist [u ]  w(u, v)}


dist[v] will be right if u is along the shortest path to v
and dist[u] is correct
How many times do we have to do this for vertex pi
to have the correct shortest path from s?

i times
s
p1
p2
correct
correct
correct
p3
pk
v
dist [v]  min{ dist [v], dist [u ]  w(u, v)}


dist[v] will be right if u is along the shortest path to v
and dist[u] is correct
How many times do we have to do this for vertex pi
to have the correct shortest path from s?

i times
s
p1
correct
correct
p2
p3
correct correct
pk
v
dist [v]  min{ dist [v], dist [u ]  w(u, v)}


dist[v] will be right if u is along the shortest path to v
and dist[u] is correct
How many times do we have to do this for vertex pi
to have the correct shortest path from s?

i times
s
p1
correct
correct
p2
p3
correct correct
pk
…
v
dist [v]  min{ dist [v], dist [u ]  w(u, v)}


dist[v] will be right if u is along the shortest
path to v and dist[u] is correct
What is the longest (vetex-wise) the path from
s to any node v can be?

|V| - 1 edges/vertices
s
p1
correct
correct
p2
p3
correct correct
pk
…
v
Bellman-Ford algorithm
Bellman-Ford algorithm
Initialize all the
distances
Bellman-Ford algorithm
iterate over all
edges/vertices
and apply update
rule
Bellman-Ford algorithm
Bellman-Ford algorithm
check for negative
cycles
Negative cycles
What is the shortest path
from a to e?
1
B
1
A
D
5
10
-10
E
C
3
Bellman-Ford algorithm
Bellman-Ford algorithm
S
10
How many edges is
the shortest path
from s to:
A
1
8
-4
G
B
A:
2
1
1
-2
F
C
3
-1
E
D
-1
Bellman-Ford algorithm
S
10
How many edges is
the shortest path
from s to:
A
1
8
-4
G
B
A:
2
1
1
-2
F
C
3
-1
E
D
-1
3
Bellman-Ford algorithm
S
10
How many edges is
the shortest path
from s to:
A
1
8
-4
G
B
A:
2
1
1
-2
F
C
3
-1
E
D
-1
B:
3
Bellman-Ford algorithm
S
10
How many edges is
the shortest path
from s to:
A
1
8
-4
G
B
2
A:
3
B:
5
1
1
-2
F
C
3
-1
E
D
-1
Bellman-Ford algorithm
S
10
How many edges is
the shortest path
from s to:
A
1
8
-4
G
B
2
A:
3
B:
5
1
1
-2
F
C
3
-1
E
D
-1
D:
Bellman-Ford algorithm
S
10
How many edges is
the shortest path
from s to:
A
1
8
-4
G
B
2
A:
3
B:
5
D:
7
1
1
-2
F
C
3
-1
E
D
-1
Bellman-Ford algorithm

0
S
10
A
Iteration: 0
1
8


-4
G
B
2
1
1

-2
F
C
3
-1
E

D
-1


Bellman-Ford algorithm
0
10
S
10
A
Iteration: 1
1
8

8
-4
G
B
2
1
1

-2
F
C
3
-1
E

D
-1


Bellman-Ford algorithm
0
10
S
10
A
Iteration: 2
1
8

8
-4
G
B
2
1
1
9
-2
F
C
3
-1
E
D
-1
12


Bellman-Ford algorithm
0
5
S
10
A
Iteration: 3
1
8
10
8
-4
G
2
1
1
9
A has the correct
distance and path
B
-2
F
C
3
-1
E
D
-1
8


Bellman-Ford algorithm
0
5
S
10
A
Iteration: 4
1
8
6
8
-4
G
B
2
1
1
9
-2
F
C
3
-1
E
D
-1
7

11
Bellman-Ford algorithm
0
5
S
10
A
Iteration: 5
1
8
5
8
-4
G
2
1
1
9
B has the correct
distance and path
B
-2
F
C
3
-1
E
D
-1
7
14
7
Bellman-Ford algorithm
0
5
S
10
A
Iteration: 6
1
8
5
8
-4
G
B
2
1
1
9
-2
F
C
3
-1
E
D
-1
7
10
6
Bellman-Ford algorithm
0
5
S
10
A
Iteration: 7
1
8
5
8
-4
G
2
1
1
9
D (and all other
nodes) have the
correct distance
and path
B
-2
F
C
3
-1
E
D
-1
7
9
6
Correctness of Bellman-Ford

Loop invariant:
Correctness of Bellman-Ford

Loop invariant: After iteration i, all vertices with
shortest paths from s of length i edges or less have
correct distances
Runtime of Bellman-Ford
O(|V| |E|)
Runtime of Bellman-Ford
Can you modify the algorithm to run
faster (in some circumstances)?
All pairs shortest paths

Simple approach




Call Bellman-Ford |V| times
O(|V|2 |E|)
Floyd-Warshall – Θ(|V|3)
Johnson’s algorithm – O(|V|2 log |V| + |V| |E|)
Minimum spanning trees

What is the lowest weight set of edges that
connects all vertices of an undirected graph
with positive weights

Input: An undirected, positive weight graph,
G=(V,E)
Output: A tree T=(V,E’) where E’  E that
minimizes

weight (T )   we
eE '
MST example
1
A
3
C
4
4
B
E
2
4
D
4
5
F
6
A
1
C
2
4
B
E
D
4
5
F
MSTs

Can an MST have a cycle?
A
1
C
2
4
B
E
4
D
4
5
F
MSTs

Can an MST have a cycle?
A
1
C
2
4
B
E
D
4
5
F
Applications?

Connectivity




Networks (e.g. communications)
Circuit desing/wiring
hub/spoke models (e.g. flights,
transportation)
Traveling salesman problem?
Cuts


A cut is a partitioning of the vertices into two sets S
and V-S
An edges “crosses” the cut if it connects a vertex
uV and vV-S
1
A
3
C
4
4
B
E
2
4
D
4
5
F
6
Minimum cut property

Given a partion S, let edge e be the minimum
cost edge that crosses the partition. Every
minimum spanning tree contains edge e.
S
V-S
e
e’
Consider an MST with edge e’ that is not the minimum edge
Minimum cut property

Given a partion S, let edge e be the minimum
cost edge that crosses the partition. Every
minimum spanning tree contains edge e.
S
V-S
e
e’
Using e instead of e’, still connects the graph,
but produces a tree with smaller weights
Algorithm ideas?

Given a partion S, let edge e be the minimum cost
edge that crosses the partition. Every minimum
spanning tree contains edge e.
Kruskal’s algorithm
Add smallest edge that connects
two sets not already connected
1
A
3
C
4
4
E
2
4
5
MST
B
D
4
F
6
A
C
E
B
D
F
G
Kruskal’s algorithm
Add smallest edge that connects
two sets not already connected
1
A
3
C
4
4
E
2
4
5
MST
B
D
4
F
6
A
1
C
E
D
F
G
B
Kruskal’s algorithm
Add smallest edge that connects
two sets not already connected
1
A
3
C
4
4
E
2
4
5
MST
B
D
4
F
6
A
1
C
G
E
2
B
D
F
Kruskal’s algorithm
Add smallest edge that connects
two sets not already connected
1
A
3
C
4
4
E
2
4
5
MST
B
D
4
F
6
A
1
C
G
2
4
B
E
D
F
Kruskal’s algorithm
Add smallest edge that connects
two sets not already connected
1
A
3
C
4
4
E
2
4
5
MST
B
D
4
F
6
A
1
C
G
2
4
B
E
D
4
F
Kruskal’s algorithm
Add smallest edge that connects
two sets not already connected
1
A
3
C
4
4
E
2
4
5
MST
B
D
4
F
6
A
1
C
G
2
4
B
E
D
4
5
F
Correctness of Kruskal’s


Never adds an edge that connects already
connected vertices
Always adds lowest cost edge to connect two sets.
By min cut property, that edge must be part of the
MST
Running time of Kruskal’s
|V| calls to MakeSet
Running time of Kruskal’s
O(|E| log |E|)
Running time of Kruskal’s
2 |E| calls to FindSet
Running time of Kruskal’s
|V| calls to Union
Running time of Kruskal’s

Disjoint set data structure
O(|E| log |E|) +
MakeSet
Linked lists
|V|
FindSet
|E| calls
O(|V| |E|)
Union
|V| calls
|V|
Total
O(|V||E| + |E| log |E|)
O(|V| |E|)
Linked lists +
heuristics
|V|
O(|E| log |V|)
|V|
O(|E| log |V|+ |E| log |E|)
O(|E| log |E| )
Prim’s algorithm
Prim’s algorithm
Prim’s algorithm
Prim’s algorithm

Start at some root node and build out the MST by
adding the lowest weighted edge at the frontier
Prim’s
1
A
3
C
4
4
B
E
2
4
D
4
5
F
6
MST
A
C
E
B
D
F
Prim’s
1
A
3
C
4
4
B
E
2
4
D
4
5
F
6
MST



A
C
E
B
D
F


0
Prim’s
1
A
3
C
4
4
B
E
2
4
D
4
5
F
6
MST

4
5
A
C
E
B
D
F

6
0
Prim’s
1
A
3
C
4
4
B
E
2
4
D
4
5
F
6
MST

4
5
A
C
E
B
D
F

6
0
Prim’s
1
A
3
C
4
4
B
E
2
4
D
4
5
F
6
MST
1
4
5
A
C
E
B
D
F
4
2
0
Prim’s
1
A
3
C
4
4
B
E
2
4
D
4
5
F
6
MST
1
4
5
A
C
E
B
D
F
4
2
0
Prim’s
1
A
3
C
4
4
B
E
2
4
D
4
5
F
6
MST
1
4
5
A
C
E
B
D
F
4
2
0
Prim’s
1
A
3
C
4
4
B
E
2
4
D
4
5
F
6
MST
1
4
5
A
C
E
B
D
F
4
2
0
Prim’s
1
A
3
C
4
4
B
E
2
4
D
4
5
F
6
MST
1
4
5
A
C
E
B
D
F
4
2
0
Prim’s
1
A
3
C
4
4
B
E
2
4
D
4
5
F
6
MST
1
4
5
A
C
E
B
D
F
4
2
0
Prim’s
1
A
3
C
4
4
B
E
2
4
D
4
5
F
6
MST
1
4
5
A
C
E
B
D
F
4
2
0
Prim’s
1
A
3
C
4
4
B
E
2
4
D
4
5
F
6
MST
1
4
5
A
C
E
B
D
F
4
2
0
Correctness of Prim’s?

Can we use the min-cut property?



Given a partion S, let edge e be the minimum cost
edge that crosses the partition. Every minimum
spanning tree contains edge e.
Let S be the set of vertices visited so far
The only time we add a new edge is if it’s the
lowest weight edge from S to V-S
Running time of Prim’s
Θ(|V|)
Running time of Prim’s
Θ(|V|)
Running time of Prim’s
|V| calls to Extract-Min
Running time of Prim’s
|E| calls to Decrease-Key
Running time of Prim’s

Same as Dijksta’s algorithm
1 MakeHeap
|V| ExtractMin
|E| DecreaseKey
Array
O(|V|)
O(|V|2)
O(|E|)
Bin heap
O(|V|)
O(|V| log |V|)
O(|E| log |V|)
Total
O(|V|2)
O((|V|+|E|) log |V|)
O(|E| log |V|)
Fib heap
O(|V|)
O(|V| log |V|)
O(|E|)
O(|V| log |V| + |E|)
Kruskal’s: O(|E| log |E| )