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
eE '
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
uV and vV-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| )
© Copyright 2026 Paperzz