m i n im um s pa nn i ng t r ee s

61
Minimum Spanning Trees

Upload: cadman-mckinney

Post on 02-Jan-2016

23 views

Category:

Documents


3 download

DESCRIPTION

M i n im um S pa nn i ng T r ee s. Mi n i m u m S pan n i n g T r e e. A t o w n h as a s et o f h o u s es a n d a s et o f r o a d s A r o ad c o n n e cts 2 a n d on ly 2 h o u s es A r o ad c o n n e cti n g h o u s es u a n d v h as a r e p air c o s t w ( u , v) - PowerPoint PPT Presentation

TRANSCRIPT

Minimum Spanning Trees

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

Growing An MST

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’s Algorithm

Networking Laboratory 11-37/62Spring 2006 Algorithm

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

Prim’s Algorithm

Networking Laboratory 11-61/62Spring 2006 Algorithm

Prim’s Algorithm

Networking Laboratory 11-62/62Spring 2006 Algorithm