Minimum Spanning Tree
• A town has a set of houses and a set of roads
• A road connects 2 and only 2 houses
• A road connecting houses u and v has a repair cost w(u, v)
• Goal: Repair enough (and no more) roads such that
» everyone stays connected: can reach every house from all other houses, and
» total repair cost is minimum
Minimum Spanning Tree
• Model as a graph:» Undirected graph G = (V, E)
» Weight w(u, v) on each edge (u, v) ∈ E
» Find T ⊆ E such that
• T connects all vertices
• (T is a spanning tree)
• w(T ) = ∑ w(u, v) is minimized ( u ,v )∈T
Minimum Spanning Tree
• A spanning tree whose weight is minimum over all spanning trees is called a
Minimum Spanning Tree, or MST
• Example:
• In this example, there is more than one MST
• Replace edge (b,c) by (a,h)
• Get a different spanning tree with the same weight
Minimum Spanning Tree
•Which edges form the Minimum Spanning Tree (MST) of the below graph?
H B C
G E D
F
A
5
1410
3
6 4
2
9
15
8
Minimum Spanning Tree
• MSTs satisfy the optimal substructure property: an optimal tree is composed of optimal subtrees
» Let T be an MST of G with an edge (u,v) in the middle
» Removing (u,v) partitions T into two trees T1 and T2
» Claim: T1 is an MST of G1 = (V1,E1), and T2 is an MST of G2 = (V2,E2) ( Do V1 and V2 share vertices? Why? )
» Proof: w(T) = w(u,v) + w(T1) + w(T2)(There can’t be a better tree than T1 or T2, or T would be suboptimal)
Some definitions
• A cut (S, V – S) of an undirected graph G =(V,E) is a partition of V
• We say that an edge (u,v) ϵ E crosses the (S, V – S) if one of its endpoints is in S and the other is in V - S.
Some definitions
• We say that a cut respects a set A of edges if no edge in A crosses the cut.
• An edge is a light edge crossing a cut if its weight is the minimum of any edge crossing the cut.
• Note that there can be more than one light edge crossing a cut in the case of ties.
• More generally, we say that an edge is a light edge satisfying a given property if its weight is the minimum of any edge satisfying the property
• Theorem 23.1Let G = (V,E) be a connected, undirected graph with a real-valued weight function w defined on E. Let A be a subset of E that is
included in some minimum spanning tree for G, let (S, V – S) be any cut of G that respects A, and let (u, v) be a light edge crossing (S, V – S). Then, edge (u, v) is safe for A.
Proof of theorem
Except for the dashed edge (u, v), all edges shown are in T. A is some subset ofthe edges of T, but A cannot contain any edges that cross the cut (S, V − S), sincethis cut respects A. Shaded edges are the path p.
Proof of theorem (1)
Since the cut respects A, edge (x, y) is not in A.To form T‘ from T :• Remove (x, y). Breaks T into two components.• Add (u, v). Reconnects.So T‘ = T − {(x, y)} {∪ (u, v)}.T’ is a spanning tree.w(T’ ) = w(T ) − w(x, y) + w(u, v) ≤ w(T) ,since w(u, v) ≤ w(x, y). Since T is a spanning tree, w(T’) ≤ w(T ), and T is anMST, then T’ must be an MST.Need to show that (u, v) is safe for A:• A ⊆ T and (x, y) ∉ A ⇒ A ⊆ T’.• A {∪ (u, v)} ⊆ T’ .• Since T’ is an MST, (u, v) is safe for A.
Generic-MST
So, in GENERIC-MST:• A is a forest containing connected components. Initially, each
component is a single vertex.• Any safe edge merges two of these components into one. Each
component is a tree.• Since an MST has exactly |V| − 1 edges, the for loop iterates |V| − 1
times. Equivalently, after adding |V|−1 safe edges, we.re down to just one component.
CorollaryIf C = (VC, EC) is a connected component in the forest GA = (V, A) and (u, v) is a light edge connecting C to some other component in GA (i.e., (u, v) is a light edge crossing the cut (VC, V − VC)), then (u, v) is safe for A.Proof Set S = VC in the theorem.
Growing An MST
• Some properties of an MST: It has |V| -1 edges
It has no cycles
It might not be unique
• Building up the solution» We will build a set A of edges
» Initially, A has no edges
» As we add edges to A, maintain a loop invariant:
• Loop invariant: A is a subset of some MST
» Add only edges that maintain the invariant
If A is a subset of some MST, an edge (u, v) is safe for A
if and only if A Ï… {(u, v)} is also a subset of some MST
So we will add only safe edges
Kruskal()
{
T = ∅;
for each v ∈ V MakeSet(v);
sort E by increasing edge weight wfor each (u,v) ∈ E (in
sorted if FindSet(u) â‰
FindSet(v)
order)
T = T U {{u,v}};
Union(FindSet(u), FindSet(v));
}
Run the algorithm:2 19
9
1
5
13
1725
148
21
Kruskal’s Algorithm
Kruskal()
{
T = ∅;
for each v ∈ V MakeSet(v);
sort E by increasing edge weight wfor each (u,v) ∈ E (in
sorted if FindSet(u) â‰
FindSet(v)
order)
T = T U {{u,v}};
Union(FindSet(u), FindSet(v));
}
Run the algorithm:2 19
9
1
5
13
1725
148
21
Kruskal’s Algorithm
Kruskal()
{
T = ∅;
for each v ∈ V MakeSet(v);
sort E by increasing edge weight wfor each (u,v) ∈ E (in
sorted if FindSet(u) â‰
FindSet(v)
order)
T = T U {{u,v}};
Union(FindSet(u), FindSet(v));
}
Run the algorithm:2 19
9
1?
5
13
1725
148
21
Kruskal’s Algorithm
Kruskal()
{
T = ∅;
for each v ∈ V MakeSet(v);
sort E by increasing edge weight wfor each (u,v) ∈ E (in
sorted if FindSet(u) â‰
FindSet(v)
order)
T = T U {{u,v}};
Union(FindSet(u), FindSet(v));
}
Run the algorithm:2 19
9
1
5
13
1725
148
21
Kruskal’s Algorithm
Kruskal()
{
T = ∅;
for each v ∈ V MakeSet(v);
sort E by increasing edge weight wfor each (u,v) ∈ E (in
sorted if FindSet(u) â‰
FindSet(v)
order)
T = T U {{u,v}};
Union(FindSet(u), FindSet(v));
}
2? 199
1
5
13
14 17258
21
Kruskal’s AlgorithmRun the algorithm:
Kruskal()
{
T = ∅;
for each v ∈ V MakeSet(v);
sort E by increasing edge weight wfor each (u,v) ∈ E (in
sorted if FindSet(u) â‰
FindSet(v)
order)
T = T U {{u,v}};
Union(FindSet(u), FindSet(v));
}
Run the algorithm:2 19
9
1
5
13
1725
148
21
Kruskal’s Algorithm
Kruskal()
{
T = ∅;
for each v ∈ V MakeSet(v);
sort E by increasing edge weight wfor each (u,v) ∈ E (in
sorted if FindSet(u) â‰
FindSet(v)
order)
T = T U {{u,v}};
Union(FindSet(u), FindSet(v));
}
Run the algorithm:2 19
9
1
5?
13
1725
148
21
Kruskal’s Algorithm
Kruskal()
{
T = ∅;
for each v ∈ V MakeSet(v);
sort E by increasing edge weight wfor each (u,v) ∈ E (in
sorted if FindSet(u) â‰
FindSet(v)
order)
T = T U {{u,v}};
Union(FindSet(u), FindSet(v));
}
Run the algorithm:2 19
9
1
5
13
1725
148
21
Kruskal’s Algorithm
Kruskal()
{
T = ∅;
for each v ∈ V MakeSet(v);
sort E by increasing edge weight wfor each (u,v) ∈ E (in
sorted if FindSet(u) â‰
FindSet(v)
order)
T = T U {{u,v}};
Union(FindSet(u), FindSet(v));
}
Run the algorithm:2 19
9
1
5
13
1725
148?
21
Kruskal’s Algorithm
Kruskal()
{
T = ∅;
for each v ∈ V MakeSet(v);
sort E by increasing edge weight wfor each (u,v) ∈ E (in
sorted if FindSet(u) â‰
FindSet(v)
order)
T = T U {{u,v}};
Union(FindSet(u), FindSet(v));
}
Run the algorithm:2 19
9
1
5
13
1725
148
21
Kruskal’s Algorithm
Kruskal()
{
T = ∅;
for each v ∈ V MakeSet(v);
sort E by increasing edge weight wfor each (u,v) ∈ E (in
sorted if FindSet(u) â‰
FindSet(v)
order)
T = T U {{u,v}};
Union(FindSet(u), FindSet(v));
}
Run the algorithm:2 19
9?
1
5
13
1725
148
21
Kruskal’s Algorithm
Kruskal()
{
T = ∅;
for each v ∈ V MakeSet(v);
sort E by increasing edge weight wfor each (u,v) ∈ E (in
sorted if FindSet(u) â‰
FindSet(v)
order)
T = T U {{u,v}};
Union(FindSet(u), FindSet(v));
}
Run the algorithm:2 19
9
1
5
13
1725
148
21
Kruskal’s Algorithm
Kruskal()
{
T = ∅;
for each v ∈ V MakeSet(v);
sort E by increasing edge weight wfor each (u,v) ∈ E (in
sorted if FindSet(u) â‰
FindSet(v)
order)
T = T U {{u,v}};
Union(FindSet(u), FindSet(v));
}
Run the algorithm:2 19
9
1
5
13?
1725
148
21
Kruskal’s Algorithm
Kruskal()
{
T = ∅;
for each v ∈ V MakeSet(v);
sort E by increasing edge weight wfor each (u,v) ∈ E (in
sorted if FindSet(u) â‰
FindSet(v)
order)
T = T U {{u,v}};
Union(FindSet(u), FindSet(v));
}
Run the algorithm:2 19
9
1
5
13
1725
148
21
Kruskal’s Algorithm
Kruskal()
{
T = ∅;
for each v ∈ V MakeSet(v);
sort E by increasing edge weight wfor each (u,v) ∈ E (in
sorted if FindSet(u) â‰
FindSet(v)
order)
T = T U {{u,v}};
Union(FindSet(u), FindSet(v));
}
Run the algorithm:2 19
9
1
5
13
1725
14?8
21
Kruskal’s Algorithm
Kruskal()
{
T = ∅;
for each v ∈ V MakeSet(v);
sort E by increasing edge weight wfor each (u,v) ∈ E (in
sorted if FindSet(u) â‰
FindSet(v)
order)
T = T U {{u,v}};
Union(FindSet(u), FindSet(v));
}
Run the algorithm:2 19
9
1
5
13
1725
148
21
Kruskal’s Algorithm
Kruskal()
{
T = ∅;
for each v ∈ V MakeSet(v);
sort E by increasing edge weight wfor each (u,v) ∈ E (in
sorted if FindSet(u) â‰
FindSet(v)
order)
T = T U {{u,v}};
Union(FindSet(u), FindSet(v));
}
Run the algorithm:2 19
9
1
5
13
17?25
148
21
Kruskal’s Algorithm
Kruskal()
{
T = ∅;
for each v ∈ V MakeSet(v);
sort E by increasing edge weight wfor each (u,v) ∈ E (in
sorted if FindSet(u) â‰
FindSet(v)
order)
T = T U {{u,v}};
Union(FindSet(u), FindSet(v));
}
Run the algorithm:2 19?
9
1
5
13
1725
148
21
Kruskal’s Algorithm
Kruskal()
{
T = ∅;
for each v ∈ V MakeSet(v);
sort E by increasing edge weight wfor each (u,v) ∈ E (in
sorted if FindSet(u) â‰
FindSet(v)
order)
T = T U {{u,v}};
Union(FindSet(u), FindSet(v));
}
Run the algorithm:2 19
9
1
5
13
1725
148
21?
Kruskal’s Algorithm
Kruskal()
{
T = ∅;
for each v ∈ V MakeSet(v);
sort E by increasing edge weight wfor each (u,v) ∈ E (in
sorted if FindSet(u) â‰
FindSet(v)
order)
T = T U {{u,v}};
Union(FindSet(u), FindSet(v));
}
Run the algorithm:2 19
9
1
5
13
1725?
148
21
Kruskal’s Algorithm
Kruskal()
{
T = ∅;
for each v ∈ V MakeSet(v);
sort E by increasing edge weight wfor each (u,v) ∈ E (in
sorted if FindSet(u) â‰
FindSet(v)
order)
T = T U {{u,v}};
Union(FindSet(u), FindSet(v));
}
Run the algorithm:2 19
9
1
5
13
1725
148
21
Kruskal’s Algorithm
Kruskal()
{
T = ∅;
for each v ∈ V MakeSet(v);
sort E by increasing edge weight wfor each (u,v) ∈ E (in
sorted if FindSet(u) â‰
FindSet(v)
order)
T = T U {{u,v}};
Union(FindSet(u), FindSet(v));
}
Run the algorithm:2 19
9
1
5
13
1725
148
21
Kruskal’s Algorithm
Kruskal’s Algorithm
Kruskal()
{
T = ∅;for each v ∈ V MakeSet(v);
sort E by increasing edge weight wfor each (u,v) ∈ E (in
sorted order)
if FindSet(u) â‰
FindSet(v) T = T U
{{u,v}};Union(FindSet(u),
FindSet(v));
}
What will affect the running time?1 Sort
O(V) MakeSet() calls O(E) FindSet()
callsO(V) Union() calls
(Exactly how many Union()s?)
Prim’s Algorithm
MST-Prim(G, w, r)
Q = V[G];
for each u ∈ Q
key[u] = ∞;
key[r] = 0;
П[r] = NULL;
while (Q not empty)
u = ExtractMin(Q);
for each v ∈
Adj[u]
if (v ∈ Q and w(u,v)
П[v] = u;
key[v] = w(u,v);
Run on example graph< key[v])
1410
3
6 45 9
2
15
8
Prim’s Algorithm
• MST-Prim(G, w,
r) Q = V[G];
• for each u ∈ Q
• key[u] = ∞;
• key[r] = 0;
• П[r] = NULL;
• while (Q not empty)
•u = ExtractMin(Q);
for each v ∈ Adj[u]• if (v ∈ Q and w(u,v) <
• П[v] = u;
• key[v] = w(u,v);
Run on example graphkey[v])
∞ ∞ ∞
∞ ∞
∞
∞5
1410
3
6 4
2
∞
9
15
8
Prim’s Algorithm
• MST-Prim(G, w,
r) Q = V[G];
• for each u ∈ Q
• key[u] = ∞;
• key[r] = 0;
• П[r] = NULL;
• while (Q not empty)
•u = ExtractMin(Q);
for each v ∈ Adj[u]• if (v ∈ Q and w(u,v) <
• П[v] = u;
• key[v] = w(u,v);
Pick a start vertex rkey[v])
∞ ∞ ∞
0 ∞
∞
∞5
1410
3
6 4
2
∞
9
15
8
r
Prim’s Algorithm
MST-Prim(G, w, r)
Q = V[G];
for each u ∈ Q
key[u] = ∞;key[r] = 0;
П[r] = NULL;
while (Q not empty)
u = ExtractMin(Q);
for each v ∈ Adj[u]if (v ∈ Q and w(u,v) <
key[v])
П[v] = u;
key[v] = w(u,v);
∞ ∞ ∞
0 ∞
∞
∞5
1410
3
6 4
2
∞
9
15
8
Black vertices have been removed from Q
u
Prim’s Algorithm
• MST-Prim(G, w,
r) Q = V[G];
• for each u ∈ Q
• key[u] = ∞;
• key[r] = 0;
• П[r] = NULL;
• while (Q not empty)
•u = ExtractMin(Q);
for each v ∈ Adj[u]• if (v ∈ Q and w(u,v) <
• П[v] = u;
• key[v] = w(u,v);
Black arrows indicate parent pointerskey[v])
∞ ∞ ∞
0 ∞
3
∞5
1410
3
6 4
2
∞
9
15
8
u
Prim’s Algorithm
MST-Prim(G, w, r)
Q = V[G];
for each u ∈ Q
key[u] = ∞;key[r] = 0;
П[r] = NULL;
while (Q not empty)
u = ExtractMin(Q);
for each v ∈ Adj[u]if (v ∈ Q and w(u,v) <
П[v] = u;
key[v] = w(u,v);
key[v])
14 ∞ ∞
0 ∞
3
∞5
1410
3
6 4
2
∞
9
15
8
u
Prim’s Algorithm
MST-Prim(G, w, r)
Q = V[G];
for each u ∈ Q
key[u] = ∞;key[r] = 0;
П[r] = NULL;
while (Q not empty)
u = ExtractMin(Q);
for each v ∈ Adj[u]if (v ∈ Q and w(u,v)
<
П[v] = u;
key[v] = w(u,v);
key[v])
14 ∞ ∞
0 ∞
3
∞5
1410
6 4
2
∞
9
15
83u
Prim’s Algorithm
MST-Prim(G, w, r)
Q = V[G];
for each u ∈ Q
key[u] = ∞;key[r] = 0;
П[r] = NULL;
while (Q not empty)
u = ExtractMin(Q);
for each v ∈ Adj[u]if (v ∈ Q and w(u,v)
<
П[v] = u;
key[v] = w(u,v);
key[v])
14 ∞ ∞
0 8 ∞
3
∞5
1410
6 4
2
9
15
83u
Prim’s Algorithm
MST-Prim(G, w, r)
Q = V[G];
for each u ∈ Q
key[u] = ∞;key[r] = 0;
П[r] = NULL;
while (Q not empty)
u = ExtractMin(Q);
for each v ∈ Adj[u]if (v ∈ Q and w(u,v)
<
П[v] = u;
key[v] = w(u,v);
key[v])
10 ∞ ∞
0 8 ∞
3
∞5
1410
6 4
2
9
15
83u
Prim’s Algorithm
MST-Prim(G, w, r)
Q = V[G];
for each u ∈ Q
key[u] = ∞;key[r] = 0;
П[r] = NULL;
while (Q not empty)
u = ExtractMin(Q);
for each v ∈ Adj[u]if (v ∈ Q and w(u,v)
<
П[v] = u;
key[v] = w(u,v);
key[v])
10 ∞ ∞
0 8 ∞
3
∞5
1410
3
6 4
2
9
15
8u
Prim’s Algorithm
MST-Prim(G, w, r)
Q = V[G];
for each u ∈ Q
key[u] = ∞;key[r] = 0;
П[r] = NULL;
while (Q not empty)
u = ExtractMin(Q);
for each v ∈ Adj[u]if (v ∈ Q and w(u,v)
<
П[v] = u;
key[v] = w(u,v);
key[v])
10 2 ∞
0 8 ∞
3
∞5
1410
3
6 4
2
9
15
8u
Prim’s Algorithm
MST-Prim(G, w, r)
Q = V[G];
for each u ∈ Q
key[u] = ∞;key[r] = 0;
П[r] = NULL;
while (Q not empty)
u = ExtractMin(Q);
for each v ∈ Adj[u]if (v ∈ Q and w(u,v)
<
П[v] = u;
key[v] = w(u,v);
key[v])
10 2 ∞
0 8 15
3
∞5
1410
3
6 4
2
9
15
8u
Prim’s Algorithm
MST-Prim(G, w, r)
Q = V[G];
for each u ∈ Q
key[u] = ∞;key[r] = 0;
П[r] = NULL;
while (Q not empty)
u = ExtractMin(Q);
for each v ∈ Adj[u]if (v ∈ Q and w(u,v)
<
П[v] = u;
key[v] = w(u,v);
key[v])
10 2 ∞
0 8 15
3
∞5
1410
3
6 4
2
9
15
8
u
Prim’s Algorithm
MST-Prim(G, w, r)
Q = V[G];
for each u ∈ Q
key[u] = ∞;key[r] = 0;
П[r] = NULL;
while (Q not empty)
u = ExtractMin(Q);
for each v ∈ Adj[u]if (v ∈ Q and w(u,v)
<
П[v] = u;
key[v] = w(u,v);
key[v])
10 2 9
0 8 15
3
∞5
1410
3
6 4
2
9
15
8
u
Prim’s Algorithm
MST-Prim(G, w, r)
Q = V[G];
for each u ∈ Q
key[u] = ∞;key[r] = 0;
П[r] = NULL;
while (Q not empty)
u = ExtractMin(Q);
for each v ∈ Adj[u]if (v ∈ Q and w(u,v)
<
П[v] = u;
key[v] = w(u,v);
key[v])
10 2 9
0 8 15
3
4
5
1410
3
6 4
2
9
15
8
u
Prim’s Algorithm
MST-Prim(G, w, r)
Q = V[G];
for each u ∈ Q
key[u] = ∞;key[r] = 0;
П[r] = NULL;
while (Q not empty)
u = ExtractMin(Q);
for each v ∈ Adj[u]if (v ∈ Q and w(u,v)
<
П[v] = u;
key[v] = w(u,v);
key[v])
5 2 9
0 8 15
3
4
5
1410
3
6 4
2
9
15
8
u
MST-Prim(G, w, r)
Q = V[G];
for each u ∈ Q
key[u] = ∞;key[r] = 0;
П[r] = NULL;
while (Q not empty)
u = ExtractMin(Q);
for each v ∈ Adj[u]if (v ∈ Q and w(u,v)
<
П[v] = u;
key[v] = w(u,v);
key[v])
5 2 9
0 8 15
3
4
5
1410
3
6 4
2
9
15
8
Prim’s Algorithm
u
Prim’s Algorithm
MST-Prim(G, w, r)
Q = V[G];
for each u ∈ Q
key[u] = ∞;key[r] = 0;
П[r] = NULL;
while (Q not empty)
u = ExtractMin(Q);
for each v ∈ Adj[u]if (v ∈ Q and w(u,v)
<
П[v] = u;
key[v] = w(u,v);
key[v])
5 2 9
0 8 15
3
4
5
1410
3
6 4
2
9
15
8
u
Prim’s Algorithm
MST-Prim(G, w, r)
Q = V[G];
for each u ∈ Q
key[u] = ∞;key[r] = 0;
П[r] = NULL;
while (Q not empty)
u = ExtractMin(Q);
for each v ∈ Adj[u]if (v ∈ Q and w(u,v)
<
П[v] = u;
key[v] = w(u,v);
key[v])
5 2 9
0 8 15
3
4
5
1410
3
6 4
2
9
15
8
u
Prim’s Algorithm
MST-Prim(G, w, r)
Q = V[G];
for each u ∈ Q
key[u] = ∞;key[r] = 0;
П[r] = NULL;
while (Q not empty)
u = ExtractMin(Q);
for each v ∈ Adj[u]if (v ∈ Q and w(u,v)
<
П[v] = u;
key[v] = w(u,v);
key[v])
5 2 9
0 8
3
4
5
1410
3
6 4
2
9
15
8
u
15