Minimum Spanning Trees
1
Lecture 25 (Graphs 4)
CS61B, Fall 2023 @ UC Berkeley
Slides credit: Josh Hug
Graph Problem Warmup
Lecture 25, CS61B, Fall 2023
Graph Problem Warmup
Minimum Spanning Trees
Prim’s Algorithm
Kruskal’s Algorithm:
Warm-up Problem
Given a undirected graph, determine if it contains any cycles.
B
C
D
E
F
G
A
Warm-up Problem
Given a undirected graph, determine if it contains any cycles.
Approach 1: Do DFS from 0 (arbitrary vertex).
Worst case runtime: O(V + E) -- do study guide problems to reinforce this.
B
C
D
E
F
G
A
Warm-up Problem
Given a undirected graph, determine if it contains any cycles.
Approach 2: Use a WeightedQuickUnionUF object.
Worst case runtime: O(V + E α(V)) if we have path compression.
B
C
D
E
F
G
A
Minimum Spanning Trees Intro
Lecture 25, CS61B, Fall 2023
Graph Problem Warmup
Minimum Spanning Trees
Prim’s Algorithm
Kruskal’s Algorithm:
Spanning Trees
Given an undirected graph, a spanning tree T is a subgraph of G, where T:
Example:
A minimum spanning tree is a spanning tree of minimum total weight.
These two properties make it a tree.
This makes it spanning.
Spanning Trees
Which are Spanning Trees? yellkey.com/TODO
A
B
C
MST Applications
Left: Old school handwriting recognition (link)
Right: Medical imaging (e.g. arrangement of nuclei in cancer cells)
For more, see: http://www.ics.uci.edu/~eppstein/gina/mst.html
Extra: Minimum Spanning Trees vs. Shortest Paths Trees
Lecture 25, CS61B, Fall 2023
These slides are covered in the web videos, but we won't cover them live.
Graph Problem Warmup
Minimum Spanning Trees
Prim’s Algorithm
Kruskal’s Algorithm:
MST
Find the MST for the graph.
B
C
A
s
2
3
2
2
D
MST
Find the MST for the graph.
B
C
A
s
2
3
2
2
D
MST vs. SPT
Is the MST for this graph also a shortest paths tree? If so, using which node as the starting node for this SPT?
B
C
A
s
2
3
2
2
D
MST vs. SPT
Is the MST for this graph also a shortest paths tree? If so, using which node as the starting node for this SPT?
B
C
A
2
3
2
2
D
s = D
Doesn’t work for s = D!
MST vs. SPT, http://yellkey.com/approach
Is the MST for this graph also a shortest paths tree? If so, using which node as the starting node for this SPT?
B
C
A
s
2
3
2
2
D
SPT from A
B
C
A
2
3
2
2
D
SPT from B,
MST
B
C
A
s
2
3
2
2
D
SPT from C
SPT from D
s
s
s
MST vs. SPT, http://yellkey.com/approach
A shortest paths tree depends on the start vertex:
There is no source for a MST.
Nonetheless, the MST sometimes happens to be an SPT for a specific vertex.�
Spanning Tree
Give a valid MST for the graph below.
2
2
2
2
1
1
1
1
1
1
1
1
1
1
1
1
0
0
Spanning Tree
Give a valid MST for the graph below.
2
2
2
2
1
1
1
1
1
1
1
1
1
1
1
1
0
0
Spanning Tree
Give a valid MST for the graph below.
2
2
2
2
1
1
1
1
1
1
1
1
1
1
1
1
0
0
2
2
2
2
1
1
1
1
1
1
1
1
1
1
1
1
0
0
Example SPT from bottom left vertex:
The Cut Property
Lecture 25, CS61B, Fall 2023
Graph Problem Warmup
Minimum Spanning Trees
Prim’s Algorithm
Kruskal’s Algorithm:
A Useful Tool for Finding the MST: Cut Property
Cut property: Given any cut, minimum weight crossing edge is in the MST.
Cut Property in Action: http://yellkey.com/TODO
Which edge is the minimum weight edge crossing the cut {2, 3, 5, 6}?
0-7 0.16
2-3 0.17
1-7 0.19
0-2 0.26
5-7 0.28
1-3 0.29
1-5 0.32
2-7 0.34
4-5 0.35
1-2 0.36
4-7 0.37
0-4 0.38
6-2 0.40
3-6 0.52
6-0 0.58
6-4 0.93
Cut Property in Action
Which edge is the minimum weight edge crossing the cut {2, 3, 5, 6}?
0-7 0.16
2-3 0.17
1-7 0.19
0-2 0.26
5-7 0.28
1-3 0.29
1-5 0.32
2-7 0.34
4-5 0.35
1-2 0.36
4-7 0.37
0-4 0.38
6-2 0.40
3-6 0.52
6-0 0.58
6-4 0.93
Cut Property Proof
Suppose that the minimum crossing edge e were not in the MST.
Generic MST Finding Algorithm
Start with no edges in the MST.
This should work, but we need some way of finding a cut with no crossing edges!
Basic Prim's (Demo)
Lecture 25, CS61B, Fall 2023
Graph Problem Warmup
Minimum Spanning Trees
Prim’s Algorithm
Kruskal’s Algorithm:
Prim’s Demo (Conceptual)
Start from some arbitrary start node.
B
C
D
E
F
G
A
s
Node edgeTo
A -
B -
C -
D -
E -
F -
G -
5
2
1
15
3
2
11
3
1
1
4
1
Prim’s Demo (Conceptual)
Start from some arbitrary start node.
B
C
D
E
F
G
A
s
Node edgeTo
A -
B -
C -
D -
E -
F -
G -
5
2
1
15
3
2
11
3
1
1
4
1
Prim’s Demo (Conceptual)
Start from some arbitrary start node.
B
C
D
E
F
G
A
s
Node edgeTo
A -
B -
C A
D -
E -
F -
G -
5
2
1
15
3
2
11
3
1
1
4
1
Prim’s Demo (Conceptual)
Start from some arbitrary start node.
B
C
D
E
F
G
A
s
Node edgeTo
A -
B -
C A
D -
E -
F -
G -
5
2
1
15
3
2
11
3
1
1
4
1
Prim’s Demo (Conceptual)
Start from some arbitrary start node.
B
C
D
E
F
G
A
s
Node edgeTo
A -
B -
C A
D -
E C
F -
G -
5
2
1
15
3
2
11
3
1
1
4
1
Prim’s Demo (Conceptual)
Start from some arbitrary start node.
B
C
D
E
F
G
A
s
Node edgeTo
A -
B -
C A
D -
E C
F -
G -
5
2
1
15
3
2
11
3
1
1
4
1
Which edge is added next?
Prim’s Demo (Conceptual)
Start from some arbitrary start node.
B
C
D
E
F
G
A
s
Node edgeTo
A -
B -
C A
D E
E C
F -
G -
5
2
1
15
3
2
11
3
1
1
4
1
Which edge is added next?
Prim’s Demo (Conceptual)
Start from some arbitrary start node.
B
C
D
E
F
G
A
s
Node edgeTo
A -
B -
C A
D E
E C
F -
G -
5
2
1
15
3
2
11
3
1
1
4
1
Prim’s Demo (Conceptual)
Start from some arbitrary start node.
B
C
D
E
F
G
A
s
Node edgeTo
A -
B -
C A
D E
E C
F -
G D
5
2
1
15
3
2
11
3
1
1
4
1
Prim’s Demo (Conceptual)
Start from some arbitrary start node.
B
C
D
E
F
G
A
s
Node edgeTo
A -
B -
C A
D E
E C
F -
G D
5
2
1
15
3
2
11
3
1
1
4
1
Prim’s Demo (Conceptual)
Start from some arbitrary start node.
B
C
D
E
F
G
A
s
Node edgeTo
A -
B -
C A
D E
E C
F G
G D
5
2
1
15
3
2
11
3
1
1
4
1
Prim’s Demo (Conceptual)
Start from some arbitrary start node.
B
C
D
E
F
G
A
s
Node edgeTo
A -
B -
C A
D E
E C
F G
G D
5
2
1
15
3
2
11
3
1
1
4
1
Prim’s Demo (Conceptual)
Start from some arbitrary start node.
B
C
D
E
F
G
A
s
Node edgeTo
A -
B A
C A
D E
E C
F G
G D
5
2
1
15
3
2
11
3
1
1
4
1
Prim’s Algorithm
Start from some arbitrary start node.
Why does Prim’s work? Special case of generic algorithm.
Optimized Prim's (Demo)
Lecture 25, CS61B, Fall 2023
Graph Problem Warmup
Minimum Spanning Trees
Prim’s Algorithm
Kruskal’s Algorithm:
Prim’s Algorithm Implementation
The natural implementation of the conceptual version of Prim’s algorithm is highly inefficient.
Can use some cleverness and a PQ to speed things up.
Realistic Implementation Demo
B
C
D
E
F
G
A
s
5
2
1
15
3
2
11
3
1
1
4
1
Prim’s Demo
Insert all vertices into fringe PQ, storing vertices in order of distance from tree.
Repeat: Remove (closest) vertex v from PQ, and relax all edges pointing from v.
B
C
D
E
F
G
A
s
Node distTo edgeTo
A 0 -
B ∞ -
C ∞ -
D ∞ -
E ∞ -
F ∞ -
G ∞ -
5
2
1
15
3
2
11
3
1
1
Fringe: [(A: 0), (B: ∞), (C: ∞), (D: ∞), (E: ∞), (F: ∞), (G: ∞)]
4
0
∞
∞
∞
∞
∞
∞
1
Prim’s Demo
Insert all vertices into fringe PQ, storing vertices in order of distance from tree.
Repeat: Remove (closest) vertex v from PQ, and relax all edges pointing from v.
B
C
D
E
F
G
A
s
Node distTo edgeTo
A 0 -
B ∞ -
C ∞ -
D ∞ -
E ∞ -
F ∞ -
G ∞ -
5
2
1
15
3
2
11
3
1
1
4
0
∞
∞
∞
∞
∞
∞
1
Fringe: [(B: ∞), (C: ∞), (D: ∞), (E: ∞), (F: ∞), (G: ∞)]
Prim’s Demo
Insert all vertices into fringe PQ, storing vertices in order of distance from tree.
Repeat: Remove (closest) vertex v from PQ, and relax all edges pointing from v.
B
C
D
E
F
G
A
s
Node distTo edgeTo
A -
B 2 A
C 1 A
D ∞ -
E ∞ -
F ∞ -
G ∞ -
5
2
1
15
3
2
11
3
1
1
Fringe: [(C: 1), (B: 2), (D: ∞), (E: ∞), (F: ∞), (G: ∞)]
4
∞
∞
∞
∞
∞
∞
1
2
1
Prim’s Demo
Insert all vertices into fringe PQ, storing vertices in order of distance from tree.
Repeat: Remove (closest) vertex v from PQ, and relax all edges pointing from v.
B
C
D
E
F
G
A
s
Node distTo edgeTo
A 0 -
B 2 A
C 1 A
D ∞ -
E ∞ -
F ∞ -
G ∞ -
5
2
1
15
3
2
11
3
1
1
Fringe: [(C: 1), (B: 2), (D: ∞), (E: ∞), (F: ∞), (G: ∞)]
4
∞
∞
∞
∞
1
2
1
Prim’s Demo
Insert all vertices into fringe PQ, storing vertices in order of distance from tree.
Repeat: Remove (closest) vertex v from PQ, and relax all edges pointing from v.
B
C
D
E
F
G
A
s
Node distTo edgeTo
A -
B 2 A
C A
D ∞ -
E ∞ -
F ∞ -
G ∞ -
5
2
1
15
3
2
11
3
1
1
Fringe: [(B: 2), (D: ∞), (E: ∞), (F: ∞), (G: ∞)]
4
∞
∞
∞
∞
1
2
Note: Vertex removal in this implementation of Prim’s is equivalent to edge addition in the conceptual version of Prim’s.
Prim’s Demo
Insert all vertices into fringe PQ, storing vertices in order of distance from tree.
Repeat: Remove (closest) vertex v from PQ, and relax all edges pointing from v.
B
C
D
E
F
G
A
s
Node distTo edgeTo
A -
B 2 A
C A
D ∞ -
E 1 C
F 15 C
G ∞ -
5
2
1
15
3
2
11
3
1
1
Fringe: [(E: 1), (B: 2), (F: 15), (D: ∞), (G: ∞)]
4
∞
∞
∞
∞
1
2
1
15
Prim’s Demo
Insert all vertices into fringe PQ, storing vertices in order of distance from tree.
Repeat: Remove (closest) vertex v from PQ, and relax all edges pointing from v.
B
C
D
E
F
G
A
s
Node distTo edgeTo
A -
B 2 A
C A
D ∞ -
E 1 C
F 15 C
G ∞ -
5
2
1
15
3
2
11
3
1
1
Fringe: [(E: 1), (B: 2), (F: 15), (D: ∞), (G: ∞)]
4
∞
∞
1
2
1
15
Prim’s Demo
Insert all vertices into fringe PQ, storing vertices in order of distance from tree.
Repeat: Remove (closest) vertex v from PQ, and relax all edges pointing from v.
B
C
D
E
F
G
A
s
Node distTo edgeTo
A -
B 2 A
C A
D ∞ -
E 1 C
F 15 C
G ∞ -
5
2
1
15
3
2
11
3
1
1
Fringe: [(E: 1), (B: 2), (F: 15), (D: ∞), (G: ∞)]
4
∞
∞
1
2
1
15
Prim’s Demo
Insert all vertices into fringe PQ, storing vertices in order of distance from tree.
Repeat: Remove (closest) vertex v from PQ, and relax all edges pointing from v.
B
C
D
E
F
G
A
s
Node distTo edgeTo
A -
B 2 A
C A
D ∞ -
E C
F 15 C
G ∞ -
5
2
1
15
3
2
11
3
1
1
Fringe: [(B: 2), (F: 15), (D: ∞), (G: ∞)]
4
∞
∞
1
2
15
Prim’s Demo
Insert all vertices into fringe PQ, storing vertices in order of distance from tree.
Repeat: Remove (closest) vertex v from PQ, and relax all edges pointing from v.
B
C
D
E
F
G
A
s
Node distTo edgeTo
A -
B 2 A
C A
D 2 E
E C
F 4 E
G 3 E
5
2
1
15
3
2
11
3
1
1
Fringe: [(B: 2), (D: 2), (G: 3), (F: 4)]
4
∞
∞
1
2
15
2
3
4
Prim’s Demo
Insert all vertices into fringe PQ, storing vertices in order of distance from tree.
Repeat: Remove (closest) vertex v from PQ, and relax all edges pointing from v.
B
C
D
E
F
G
A
s
Node distTo edgeTo
A -
B 2 A
C A
D 2 E
E C
F 4 E
G 3 E
5
2
1
15
3
2
11
3
1
1
Fringe: [(B: 2), (D: 2), (G: 3), (F: 4)]
4
1
2
2
3
4
Prim’s Demo
Insert all vertices into fringe PQ, storing vertices in order of distance from tree.
Repeat: Remove (closest) vertex v from PQ, and relax all edges pointing from v.
B
C
D
E
F
G
A
s
Node distTo edgeTo
A -
B A
C A
D 2 E
E C
F 4 E
G 3 E
5
2
1
15
3
2
11
3
1
1
Fringe: [(D: 2), (G: 3), (F: 4)]
4
1
2
3
4
No need to consider edges with weight 5 and 3 since other side is already marked!
Prim’s Demo
Insert all vertices into fringe PQ, storing vertices in order of distance from tree.
Repeat: Remove (closest) vertex v from PQ, and relax all edges pointing from v.
B
C
D
E
F
G
A
s
Node distTo edgeTo
A -
B A
C A
D 2 E
E C
F 4 E
G 3 E
5
2
1
15
3
2
11
3
1
1
Fringe: [(D: 2), (G: 3), (F: 4)]
4
1
2
3
4
Prim’s Demo
Insert all vertices into fringe PQ, storing vertices in order of distance from tree.
Repeat: Remove (closest) vertex v from PQ, and relax all edges pointing from v.
B
C
D
E
F
G
A
s
Node distTo edgeTo
A -
B A
C A
D E
E C
F 4 E
G 3 E
5
2
1
15
3
2
11
3
1
1
Fringe: [(G: 3), (F: 4)]
4
1
3
4
Prim’s Demo
Insert all vertices into fringe PQ, storing vertices in order of distance from tree.
Repeat: Remove (closest) vertex v from PQ, and relax all edges pointing from v.
B
C
D
E
F
G
A
s
Node distTo edgeTo
A -
B A
C A
D E
E C
F 4 E
G 1 D
5
2
1
15
3
2
11
3
1
1
Fringe: [(G: 1), (F: 4)]
4
1
3
4
1
Prim’s Demo
Insert all vertices into fringe PQ, storing vertices in order of distance from tree.
Repeat: Remove (closest) vertex v from PQ, and relax all edges pointing from v.
B
C
D
E
F
G
A
s
Node distTo edgeTo
A -
B A
C A
D E
E C
F 4 E
G 1 D
5
2
1
15
3
2
11
3
1
1
Fringe: [(G: 1), (F: 4)]
4
1
4
1
Prim’s Demo
Insert all vertices into fringe PQ, storing vertices in order of distance from tree.
Repeat: Remove (closest) vertex v from PQ, and relax all edges pointing from v.
B
C
D
E
F
G
A
s
Node distTo edgeTo
A -
B A
C A
D E
E C
F 1 G
G D
5
2
1
15
3
2
11
3
1
1
Fringe: [(F: 1)]
4
1
4
1
Prim’s Demo
Insert all vertices into fringe PQ, storing vertices in order of distance from tree.
Repeat: Remove (closest) vertex v from PQ, and relax all edges pointing from v.
B
C
D
E
F
G
A
s
Node distTo edgeTo
A -
B A
C A
D E
E C
F 1 G
G D
5
2
1
15
3
2
11
3
1
1
Fringe: [(F: 1)]
4
1
1
Prim’s Demo
Insert all vertices into fringe PQ, storing vertices in order of distance from tree.
Repeat: Remove (closest) vertex v from PQ, and relax all edges pointing from v.
B
C
D
E
F
G
A
s
Node distTo edgeTo
A -
B A
C A
D E
E C
F G
G D
5
2
1
15
3
2
11
3
1
1
Fringe: []
4
1
Prim’s Algorithm Code and Runtime
Lecture 25, CS61B, Fall 2023
Graph Problem Warmup
Minimum Spanning Trees
Prim’s Algorithm
Kruskal’s Algorithm:
Prim’s vs. Dijkstra’s
Prim’s and Dijkstra’s algorithms are exactly the same, except Dijkstra’s considers “distance from the source”, and Prim’s considers “distance from the tree.”
Visit order:
Relaxation:
Prim’s vs. Dijkstra’s (visual)
Demos courtesy of Kevin Wayne, Princeton University
Prim’s Implementation (Pseudocode, 1/2)
public class PrimMST {
public PrimMST(EdgeWeightedGraph G) {
edgeTo = new Edge[G.V()];
distTo = new double[G.V()];
marked = new boolean[G.V()];
fringe = new SpecialPQ<Double>(G.V());
distTo[s] = 0.0;
setDistancesToInfinityExceptS(s);
insertAllVertices(fringe);
/* Get vertices in order of distance from tree. */
while (!fringe.isEmpty()) {
int v = fringe.delMin();
scan(G, v);
}
}
...
Fringe is ordered by distTo tree. Must be a specialPQ like Dijkstra’s.
Get vertex closest to tree that is unvisited.
Scan means to consider all of a vertices outgoing edges.
Prim’s Implementation (Pseudocode, 2/2)
private void scan(EdgeWeightedGraph G, int v) {
marked[v] = true;
for (Edge e : G.adj(v)) {
int w = e.other(v);
if (marked[w]) { continue; }
if (e.weight() < distTo[w]) {
distTo[w] = e.weight();
edgeTo[w] = e;
pq.decreasePriority(w, distTo[w]);
}
}
}
Important invariant, fringe must be ordered by current best known distance from tree.
Already in MST, so go to next edge.
Better path to a particular vertex found, so update current best known for that vertex.
Vertex is closest, so add to MST.
while (!fringe.isEmpty()) {
int v = fringe.delMin();
scan(G, v);
}
Prim’s Runtime
What is the runtime of Prim’s algorithm?
private void scan(EdgeWeightedGraph G, int v) {
marked[v] = true;
for (Edge e : G.adj(v)) {
int w = e.other(v);
if (marked[w]) { continue; }
if (e.weight() < distTo[w]) {
distTo[w] = e.weight();
edgeTo[w] = e;
pq.decreasePriority(w, distTo[w]);
}
}
}
while (!fringe.isEmpty()) {
int v = fringe.delMin();
scan(G, v);
}
Prim’s Algorithm Runtime
Priority Queue operation count, assuming binary heap based PQ:
Overall runtime: O(V*log(V) + V*log(V) + E*log(V)).
| # Operations | Cost per operation | Total cost |
PQ add | V | O(log V) | O(V log V) |
PQ delMin | V | O(log V) | O(V log V) |
PQ decreasePriority | O(E) | O(log V) | O(E log V) |
Basic Kruskal’s (Demo)
Lecture 25, CS61B, Fall 2023
Graph Problem Warmup
Minimum Spanning Trees
Prim’s Algorithm
Kruskal’s Algorithm:
Kruskal’s Demo
Consider edges in order of increasing weight. Add to MST unless a cycle is created.�Repeat until V-1 edges.
B
C
D
E
F
G
A
s
MST: []
5
2
1
15
3
3
11
3
1
1
A-C 1
C-E 1
D-G 1
F-G 1
A-B 2
E-B 3
D-E 3
G-E 3
E-F 4
B-C 5
B-D 11
C-F 15
4
1
Kruskal’s Demo
Consider edges in order of increasing weight. Add to MST unless a cycle is created.�Repeat until V-1 edges.
B
C
D
E
F
G
A
s
MST: []
5
2
1
15
3
3
11
3
1
1
A-C 1
C-E 1
D-G 1
F-G 1
A-B 2
E-B 3
D-E 3
G-E 3
E-F 4
B-C 5
B-D 11
C-F 15
4
1
Cycle?
White and green colorings for vertices show cut being implicitly utilized by Kruskal’s algorithm.
Kruskal’s Demo
Consider edges in order of increasing weight. Add to MST unless a cycle is created.�Repeat until V-1 edges.
B
C
D
E
F
G
A
s
MST: [A-C]
5
2
1
15
3
3
11
3
1
1
A-C 1
C-E 1
D-G 1
F-G 1
A-B 2
E-B 3
D-E 3
G-E 3
E-F 4
B-C 5
B-D 11
C-F 15
4
1
Cycle? No.
Kruskal’s Demo
Consider edges in order of increasing weight. Add to MST unless a cycle is created.�Repeat until V-1 edges.
B
C
D
E
F
G
A
s
MST: [A-C]
5
2
1
15
3
3
11
3
1
1
A-C 1
C-E 1
D-G 1
F-G 1
A-B 2
E-B 3
D-E 3
G-E 3
E-F 4
B-C 5
B-D 11
C-F 15
4
1
Cycle? No.
White and green colorings for vertices show cut being implicitly utilized by Kruskal’s algorithm.
Kruskal’s Demo
Consider edges in order of increasing weight. Add to MST unless a cycle is created.�Repeat until V-1 edges.
B
C
D
E
F
G
A
s
MST: [A-C, C-E]
5
2
1
15
3
3
11
3
1
1
A-C 1
C-E 1
D-G 1
F-G 1
A-B 2
E-B 3
D-E 3
G-E 3
E-F 4
B-C 5
B-D 11
C-F 15
4
1
Cycle? No.
Kruskal’s Demo
Consider edges in order of increasing weight. Add to MST unless a cycle is created.�Repeat until V-1 edges.
B
C
D
E
F
G
A
s
MST: [A-C, C-E]
5
2
1
15
3
3
11
3
1
1
A-C 1
C-E 1
D-G 1
F-G 1
A-B 2
E-B 3
D-E 3
G-E 3
E-F 4
B-C 5
B-D 11
C-F 15
4
1
Cycle?
White and green colorings for vertices show cut being implicitly utilized by Kruskal’s algorithm.
Kruskal’s Demo
Consider edges in order of increasing weight. Add to MST unless a cycle is created.�Repeat until V-1 edges.
B
C
D
E
F
G
A
s
MST: [A-C, C-E, D-G]
5
2
1
15
3
3
11
3
1
1
A-C 1
C-E 1
D-G 1
F-G 1
A-B 2
E-B 3
D-E 3
G-E 3
E-F 4
B-C 5
B-D 11
C-F 15
4
1
Cycle? No.
Kruskal’s Demo
Consider edges in order of increasing weight. Add to MST unless a cycle is created.�Repeat until V-1 edges.
B
C
D
E
F
G
A
s
MST: [A-C, C-E, D-G]
5
2
1
15
3
3
11
3
1
1
A-C 1
C-E 1
D-G 1
F-G 1
A-B 2
E-B 3
D-E 3
G-E 3
E-F 4
B-C 5
B-D 11
C-F 15
4
1
Cycle?
White and green colorings for vertices show cut being implicitly utilized by Kruskal’s algorithm.
Kruskal’s Demo
Consider edges in order of increasing weight. Add to MST unless a cycle is created.�Repeat until V-1 edges.
B
C
D
E
F
G
A
s
MST: [A-C, C-E, D-G, F-G]
5
2
1
15
3
3
11
3
1
1
A-C 1
C-E 1
D-G 1
F-G 1
A-B 2
E-B 3
D-E 3
G-E 3
E-F 4
B-C 5
B-D 11
C-F 15
4
1
Cycle? No.
Kruskal’s Demo
Consider edges in order of increasing weight. Add to MST unless a cycle is created.�Repeat until V-1 edges.
B
C
D
E
F
G
A
s
MST: [A-C, C-E, D-G, F-G]
5
2
1
15
3
3
11
3
1
1
A-C 1
C-E 1
D-G 1
F-G 1
A-B 2
E-B 3
D-E 3
G-E 3
E-F 4
B-C 5
B-D 11
C-F 15
4
1
Cycle?
White and green colorings for vertices show cut being implicitly utilized by Kruskal’s algorithm.
Kruskal’s Demo
Consider edges in order of increasing weight. Add to MST unless a cycle is created.�Repeat until V-1 edges.
B
C
D
E
F
G
A
s
MST: [A-C, C-E, D-G, F-G, A-B]
5
2
1
15
3
3
11
3
1
1
A-C 1
C-E 1
D-G 1
F-G 1
A-B 2
E-B 3
D-E 3
G-E 3
E-F 4
B-C 5
B-D 11
C-F 15
4
1
Cycle? No.
Kruskal’s Demo
Consider edges in order of increasing weight. Add to MST unless a cycle is created.�Repeat until V-1 edges.
B
C
D
E
F
G
A
s
MST: [A-C, C-E, D-G, F-G, A-B]
5
2
1
15
3
3
11
3
1
1
A-C 1
C-E 1
D-G 1
F-G 1
A-B 2
E-B 3
D-E 3
G-E 3
E-F 4
B-C 5
B-D 11
C-F 15
4
1
Cycle?
White and green colorings for vertices show cut being implicitly utilized by Kruskal’s algorithm.
Kruskal’s Demo
Consider edges in order of increasing weight. Add to MST unless a cycle is created.�Repeat until V-1 edges.
B
C
D
E
F
G
A
s
MST: [A-C, C-E, D-G, F-G, A-B]
5
2
1
15
3
3
11
3
1
1
A-C 1
C-E 1
D-G 1
F-G 1
A-B 2
E-B 3
D-E 3
G-E 3
E-F 4
B-C 5
B-D 11
C-F 15
4
1
Cycle? Yes. Reject!
Kruskal’s Demo
Consider edges in order of increasing weight. Add to MST unless a cycle is created.�Repeat until V-1 edges.
B
C
D
E
F
G
A
s
MST: [A-C, C-E, D-G, F-G, A-B]
5
2
1
15
3
3
11
3
1
1
A-C 1
C-E 1
D-G 1
F-G 1
A-B 2
E-B 3
D-E 3
G-E 3
E-F 4
B-C 5
B-D 11
C-F 15
4
1
Cycle?
White and green colorings for vertices show cut being implicitly utilized by Kruskal’s algorithm.
Kruskal’s Demo
Consider edges in order of increasing weight. Add to MST unless a cycle is created.�Repeat until V-1 edges.
B
C
D
E
F
G
A
s
MST: [A-C, C-E, D-G, F-G, A-B, D-E]
5
2
1
15
3
3
11
3
1
1
A-C 1
C-E 1
D-G 1
F-G 1
A-B 2
E-B 3
D-E 3
G-E 3
E-F 4
B-C 5
B-D 11
C-F 15
4
1
Cycle? No.
V-1 edges, so we’re done!
Kruskal’s Algorithm
Initially mark all edges gray.
�Why does Kruskal’s work? Special case of generic MST algorithm.
Optimized Kruskal’s (Demo)
Lecture 25, CS61B, Fall 2023
Graph Problem Warmup
Minimum Spanning Trees
Prim’s Algorithm
Kruskal’s Algorithm:
Kruskal’s Demo
Insert all edges into PQ.
Repeat: Remove smallest weight edge. Add to MST if no cycle created.
B
C
D
E
F
G
A
s
MST: []
5
2
1
15
3
3
11
3
1
1
Fringe: (A-C: 1), (C-E: 1),
(D-G: 1), (F-G: 1),
(A-B: 2), (E-B: 3),
(D-E: 3), (G-E: 3),
(E-F: 4), (B-C: 5),
(B-D: 11), (C-F: 15)
4
1
WQU: []
Kruskal’s Demo
Insert all edges into PQ.
Repeat: Remove smallest weight edge. Add to MST if no cycle created.
B
C
D
E
F
G
A
s
MST: []
5
2
1
15
3
3
11
3
1
1
Fringe: (A-C: 1), (C-E: 1),
(D-G: 1), (F-G: 1),
(A-B: 2), (E-B: 3),
(D-E: 3), (G-E: 3),
(E-F: 4), (B-C: 5),
(B-D: 11), (C-F: 15)
4
1
Cycle? isConnected(A, C)
WQU: []
Removed edge: A-C
Kruskal’s Demo
Insert all edges into PQ.
Repeat: Remove smallest weight edge. Add to MST if no cycle created.
B
C
D
E
F
G
A
s
MST: [A-C]
5
2
1
15
3
3
11
3
1
1
Fringe: (A-C: 1), (C-E: 1),
(D-G: 1), (F-G: 1),
(A-B: 2), (E-B: 3),
(D-E: 3), (G-E: 3),
(E-F: 4), (B-C: 5),
(B-D: 11), (C-F: 15)
4
1
Cycle? No. union(A, C). add(A-C).
WQU: [A-C]
Removed edge: A-C
Kruskal’s Demo
Insert all edges into PQ.
Repeat: Remove smallest weight edge. Add to MST if no cycle created.
B
C
D
E
F
G
A
s
MST: [A-C]
5
2
1
15
3
3
11
3
1
1
Fringe: (A-C: 1), (C-E: 1),
(D-G: 1), (F-G: 1),
(A-B: 2), (E-B: 3),
(D-E: 3), (G-E: 3),
(E-F: 4), (B-C: 5),
(B-D: 11), (C-F: 15)
4
1
Cycle? isConnected(C, E)
WQU: [A-C]
Removed edge: C-E
Kruskal’s Demo
Insert all edges into PQ.
Repeat: Remove smallest weight edge. Add to MST if no cycle created.
B
C
D
E
F
G
A
s
MST: [A-C, C-E]
5
2
1
15
3
3
11
3
1
1
Fringe: (A-C: 1), (C-E: 1),
(D-G: 1), (F-G: 1),
(A-B: 2), (E-B: 3),
(D-E: 3), (G-E: 3),
(E-F: 4), (B-C: 5),
(B-D: 11), (C-F: 15)
4
1
Cycle? No. union(C, E). add(C-E)
WQU: [A-C-E]
Removed edge: C-E
Kruskal’s Demo
Insert all edges into PQ.
Repeat: Remove smallest weight edge. Add to MST if no cycle created.
B
C
D
E
F
G
A
s
MST: [A-C, C-E]
5
2
1
15
3
3
11
3
1
1
Fringe: (A-C: 1), (C-E: 1),
(D-G: 1), (F-G: 1),
(A-B: 2), (E-B: 3),
(D-E: 3), (G-E: 3),
(E-F: 4), (B-C: 5),
(B-D: 11), (C-F: 15)
4
1
Cycle? isConnected(D, G)
WQU: [A-C-E]
Removed edge: D-G
Kruskal’s Demo
Insert all edges into PQ.
Repeat: Remove smallest weight edge. Add to MST if no cycle created.
B
C
D
E
F
G
A
s
MST: [A-C, C-E, D-G]
5
2
1
15
3
3
11
3
1
1
Fringe: (A-C: 1), (C-E: 1),
(D-G: 1), (F-G: 1),
(A-B: 2), (E-B: 3),
(D-E: 3), (G-E: 3),
(E-F: 4), (B-C: 5),
(B-D: 11), (C-F: 15)
4
1
Cycle? No. union(D, G). add(D-G).
WQU: [A-C-E, D-G]
Removed edge: D-G
Kruskal’s Demo
Insert all edges into PQ.
Repeat: Remove smallest weight edge. Add to MST if no cycle created.
B
C
D
E
F
G
A
s
MST: [A-C, C-E, D-G]
5
2
1
15
3
3
11
3
1
1
Fringe: (A-C: 1), (C-E: 1),
(D-G: 1), (F-G: 1),
(A-B: 2), (E-B: 3),
(D-E: 3), (G-E: 3),
(E-F: 4), (B-C: 5),
(B-D: 11), (C-F: 15)
4
1
Cycle? isConnected(F, G)
WQU: [A-C-E, D-G]
Removed edge: F-G
Kruskal’s Demo
Insert all edges into PQ.
Repeat: Remove smallest weight edge. Add to MST if no cycle created.
B
C
D
E
F
G
A
s
MST: [A-C, C-E, D-G, F-G]
5
2
1
15
3
3
11
3
1
1
Fringe: (A-C: 1), (C-E: 1),
(D-G: 1), (F-G: 1),
(A-B: 2), (E-B: 3),
(D-E: 3), (G-E: 3),
(E-F: 4), (B-C: 5),
(B-D: 11), (C-F: 15)
4
1
Cycle? No. union(F, G). add(F-G).
WQU: [A-C-E, D-G-F]
Removed edge: F-G
Kruskal’s Demo
Insert all edges into PQ.
Repeat: Remove smallest weight edge. Add to MST if no cycle created.
B
C
D
E
F
G
A
s
MST: [A-C, C-E, D-G, F-G]
5
2
1
15
3
3
11
3
1
1
Fringe: (A-C: 1), (C-E: 1),
(D-G: 1), (F-G: 1),
(A-B: 2), (E-B: 3),
(D-E: 3), (G-E: 3),
(E-F: 4), (B-C: 5),
(B-D: 11), (C-F: 15)
4
1
Cycle? isConnected(A, B)
WQU: [A-C-E, D-G-F]
Removed edge: A-B
Kruskal’s Demo
Insert all edges into PQ.
Repeat: Remove smallest weight edge. Add to MST if no cycle created.
B
C
D
E
F
G
A
s
MST: [A-C, C-E, D-G, F-G, A-B]
5
2
1
15
3
3
11
3
1
1
Fringe: (A-C: 1), (C-E: 1),
(D-G: 1), (F-G: 1),
(A-B: 2), (E-B: 3),
(D-E: 3), (G-E: 3),
(E-F: 4), (B-C: 5),
(B-D: 11), (C-F: 15)
4
1
Cycle? No. union(A, B). add(A-B)
WQU: [A-C-E-B, D-G-F]
Removed edge: A-B
Kruskal’s Demo
Insert all edges into PQ.
Repeat: Remove smallest weight edge. Add to MST if no cycle created.
B
C
D
E
F
G
A
s
MST: [A-C, C-E, D-G, F-G, A-B]
5
2
1
15
3
3
11
3
1
1
Fringe: (A-C: 1), (C-E: 1),
(D-G: 1), (F-G: 1),
(A-B: 2), (E-B: 3),
(D-E: 3), (G-E: 3),
(E-F: 4), (B-C: 5),
(B-D: 11), (C-F: 15)
4
1
Cycle? isConnected(E, B)
WQU: [A-C-E-B, D-G-F]
Removed edge: E-B
Kruskal’s Demo
Insert all edges into PQ.
Repeat: Remove smallest weight edge. Add to MST if no cycle created.
B
C
D
E
F
G
A
s
MST: [A-C, C-E, D-G, F-G, A-B]
5
2
1
15
3
3
11
3
1
1
Fringe: (A-C: 1), (C-E: 1),
(D-G: 1), (F-G: 1),
(A-B: 2), (E-B: 3),
(D-E: 3), (G-E: 3),
(E-F: 4), (B-C: 5),
(B-D: 11), (C-F: 15)
4
1
Cycle? Yes. Do nothing.
WQU: [A-C-E-B, D-G-F]
Removed edge: E-B
Kruskal’s Demo
Insert all edges into PQ.
Repeat: Remove smallest weight edge. Add to MST if no cycle created.
B
C
D
E
F
G
A
s
MST: [A-C, C-E, D-G, F-G, A-B]
5
2
1
15
3
3
11
3
1
1
Fringe: (A-C: 1), (C-E: 1),
(D-G: 1), (F-G: 1),
(A-B: 2), (E-B: 3),
(D-E: 3), (G-E: 3),
(E-F: 4), (B-C: 5),
(B-D: 11), (C-F: 15)
4
1
Cycle? isConnected(D, E)
WQU: [A-C-E-B, D-G-F]
Removed edge: D-E
Kruskal’s Demo
Insert all edges into PQ.
Repeat: Remove smallest weight edge. Add to MST if no cycle created.
B
C
D
E
F
G
A
s
MST: [A-C, C-E, D-G, F-G, A-B, D-E]
5
2
1
15
3
3
11
3
1
1
Fringe: (A-C: 1), (C-E: 1),
(D-G: 1), (F-G: 1),
(A-B: 2), (E-B: 3),
(D-E: 3), (G-E: 3),
(E-F: 4), (B-C: 5),
(B-D: 11), (C-F: 15)
4
1
Cycle? No. union(D, E). add(D-E).
V-1 edges, so done.
WQU: [A-C-E-B-D-G-F]
Removed edge: D-E
Kruskal's vs. Prim's
Lecture 25, CS61B, Fall 2023
Graph Problem Warmup
Minimum Spanning Trees
Prim’s Algorithm
Kruskal’s Algorithm:
Prim’s vs. Kruskal’s (visual)
Demos courtesy of Kevin Wayne, Princeton University
Kruskal's Algorithm Code and Runtime
Lecture 25, CS61B, Fall 2023
Graph Problem Warmup
Minimum Spanning Trees
Prim’s Algorithm
Kruskal’s Algorithm:
Kruskal’s Implementation (Pseudocode)
public class KruskalMST {
private List<Edge> mst = new ArrayList<Edge>();
public KruskalMST(EdgeWeightedGraph G) {
MinPQ<Edge> pq = new MinPQ<Edge>();
for (Edge e : G.edges()) {
pq.insert(e);
}
WeightedQuickUnionPC uf =
new WeightedQuickUnionPC(G.V());
while (!pq.isEmpty() && mst.size() < G.V() - 1) {
Edge e = pq.delMin();
int v = e.from();
int w = e.to();
if (!uf.connected(v, w)) {
uf.union(v, w);
mst.add(e);
} } } }
What is the runtime of Kruskal’s algorithm?
Kruskal’s Runtime
Kruskal’s algorithm on previous slide is O(E log E).
Note 1: If we use a pre-sorted list of edges (instead of a PQ), then we can simply iterate through the list in O(E) time, so overall runtime is O(E + V log* V + E log* V) = O(E log* V).
Note 2: E < V2, so log E < log V2 = 2 log V, so O(E log E) = O(E log V). So while Kruskal's algorithm will be slower than Prim's algorithm for a worst-case unsorted set of edges, it won't be asymptotically slower.
Operation | Number of Times | Time per Operation | Total Time |
Insert | E | O(log E) | O(E log E) |
Delete minimum | O(E) | O(log E) | O(E log E) |
union | O(V) | O(log* V) | O(V log* V) |
isConnected | O(E) | O(log* V) | O(E log* V) |
Fun fact: In HeapSort lecture, we will discuss how do this step in O(E) time using “bottom-up heapification”.
Shortest Paths and MST Algorithms Summary
Question: Can we do better than O(E log V)? See bonus slides.
Problem | Algorithm | Runtime (if E > V) | Notes |
Shortest Paths | Dijkstra’s | O(E log V) | Fails for negative weight edges. |
MST | Prim’s | O(E log V) | Analogous to Dijkstra’s. |
MST | Kruskal’s | O(E log E) | Uses WQUPC. |
MST | Kruskal’s with pre-sorted edges | O(E log* V) | Uses WQUPC. |
Extra: MST Algorithm History
Lecture 25, CS61B, Fall 2023
These slides are covered in the web videos, but we won't cover them live.
Graph Problem Warmup
Minimum Spanning Trees
Prim’s Algorithm
Kruskal’s Algorithm:
170 Spoiler: State of the Art Compare-Based MST Algorithms
year | worst case | discovered by |
1975 | E log log V | Yao |
1984 | E log* V | Fredman-Tarjan |
1986 | E log (log* V) | Gabow-Galil-Spencer-Tarjan |
1997 | E α(V) log α(V) | Chazelle |
2000 | E α(V) | Chazelle |
2002 | optimal (link) | Pettie-Ramachandran |
??? | E ??? | ??? |
(Slide Courtesy of Kevin Wayne, Princeton University)