Lecture 25
Lecture 25
Topological Sort
Minimum Spanning Trees
DFS_Visit(u)
{
u->color = YELLOW;
time = time+1;
u->d = time;
for each v u->Adj[]
{
if (v->color == WHITE)
DFS_Visit(v);
}
u->color = BLACK;
time = time+1;
u->f = time;
}
1 |
1 |
2 |
d
1 |
f
|
2 |
3 |
1 |
2 |
3 | 4
1 |
2 |
3 | 4
5 |
1 |
2 |
3 | 4
5 | 6
1 |
8 |
2 | 7
3 | 4
5 | 6
1 |
8 |
2 | 7
3 | 4
5 | 6
1 |
8 |
2 | 7
9 |
3 | 4
5 | 6
1 |
8 |
2 | 7
9 |10
3 | 4
5 | 6
1 |
8 |11
2 | 7
9 |10
3 | 4
5 | 6
1 |12
8 |11
2 | 7
9 |10
3 | 4
5 | 6
1 |12
8 |11
2 | 7
13|
9 |10
3 | 4
5 | 6
1 |12
8 |11
2 | 7
13|
9 |10
3 | 4
5 | 6
14|
1 |12
8 |11
2 | 7
13|
9 |10
3 | 4
5 | 6
14|15
1 |12
8 |11
2 | 7
13|16
9 |10
3 | 4
5 | 6
14|15
1 |12
8 |11
2 | 7
13|16
9 |10
3 | 4
5 | 6
14|15
O(V) time:
In an undirected acyclic forest, |E| |V| - 1
So count the edges: if ever see |V| distinct edges,
Topological Sort
Topological sort of a DAG:
Linear ordering of all vertices in graph G such that
Getting Dressed
Underwear
Socks
Watch
Pants
Shoes
Shirt
Belt
Tie
Jacket
Getting Dressed
Underwear
Socks
Watch
Pants
Shoes
Shirt
Belt
Tie
Jacket
Socks
Underwear
Pants
Shoes
Watch
Shirt
Belt
Tie
Jacket
Time: O(V+E)
Correctness: Want to prove that
(u,v) G uf > vf
weighted graph:
6
4
5
14
10
15
3
4
5
14
10
15
3
H
14
10
G
E
3
15
H
14
10
G
E
3
15
G2 = (V2,E2)
Prims Algorithm
MST-Prim(G, w, r)
Q = V[G];
for each u Q
key[u] = ;
key[r] = 0;
p[r] = NULL;
while (Q not empty)
u = ExtractMin(Q);
for each v Adj[u]
if (v Q and w(u,v) < key[v])
p[v] = u;
key[v] = w(u,v);
Prims Algorithm
MST-Prim(G, w, r)
6
4
9
Q = V[G];
5
for each u Q
14
key[u] = ;
2
10
15
key[r] = 0;
p[r] = NULL;
3
8
while (Q not empty)
u = ExtractMin(Q);
Run on example graph
for each v Adj[u]
if (v Q and w(u,v) < key[v])
p[v] = u;
key[v] = w(u,v);
Prims Algorithm
MST-Prim(G, w, r)
6
4
9
Q = V[G];
5
for each u Q
14
key[u] = ;
2
10
15
key[r] = 0;
p[r] = NULL;
3
8
Prims Algorithm
MST-Prim(G, w, r)
6
4
9
Q = V[G];
5
for each u Q
14
key[u] = ;
2
10
15
key[r] = 0;
0
r
p[r] = NULL;
3
8
Prims Algorithm
MST-Prim(G, w, r)
6
4
9
Q = V[G];
5
for each u Q
14
key[u] = ;
2
10
15
key[r] = 0;
0
u
p[r] = NULL;
3
8
Prims Algorithm
MST-Prim(G, w, r)
6
4
9
Q = V[G];
5
for each u Q
14
key[u] = ;
2
10
15
key[r] = 0;
0
u
p[r] = NULL;
3
8
3
while (Q not empty)
u = ExtractMin(Q);
Red arrows indicate parent pointers
for each v Adj[u]
if (v Q and w(u,v) < key[v])
p[v] = u;
key[v] = w(u,v);
Prims Algorithm
MST-Prim(G, w, r)
6
4
Q = V[G];
5
14
for each u Q
14
key[u] = ;
2
10
key[r] = 0;
0
u
p[r] = NULL;
3
8
3
while (Q not empty)
u = ExtractMin(Q);
for each v Adj[u]
if (v Q and w(u,v) < key[v])
p[v] = u;
key[v] = w(u,v);
15
Prims Algorithm
MST-Prim(G, w, r)
6
4
Q = V[G];
5
14
for each u Q
14
key[u] = ;
2
10
key[r] = 0;
0
p[r] = NULL;
3
8
3
while (Q not empty)
u
u = ExtractMin(Q);
for each v Adj[u]
if (v Q and w(u,v) < key[v])
p[v] = u;
key[v] = w(u,v);
15
Prims Algorithm
MST-Prim(G, w, r)
6
4
Q = V[G];
5
14
for each u Q
14
key[u] = ;
2
10
key[r] = 0;
0
8
p[r] = NULL;
3
8
3
while (Q not empty)
u
u = ExtractMin(Q);
for each v Adj[u]
if (v Q and w(u,v) < key[v])
p[v] = u;
key[v] = w(u,v);
15
Prims Algorithm
MST-Prim(G, w, r)
6
4
Q = V[G];
5
10
for each u Q
14
key[u] = ;
2
10
key[r] = 0;
0
8
p[r] = NULL;
3
8
3
while (Q not empty)
u
u = ExtractMin(Q);
for each v Adj[u]
if (v Q and w(u,v) < key[v])
p[v] = u;
key[v] = w(u,v);
15
Prims Algorithm
MST-Prim(G, w, r)
6
4
Q = V[G];
5
10
for each u Q
14
key[u] = ;
2
10
key[r] = 0;
0
8
p[r] = NULL;
3
8
3
while (Q not empty)
u
u = ExtractMin(Q);
for each v Adj[u]
if (v Q and w(u,v) < key[v])
p[v] = u;
key[v] = w(u,v);
15
Prims Algorithm
MST-Prim(G, w, r)
6
4
Q = V[G];
5
10
2
for each u Q
14
key[u] = ;
2
10
key[r] = 0;
0
8
p[r] = NULL;
3
8
3
while (Q not empty)
u
u = ExtractMin(Q);
for each v Adj[u]
if (v Q and w(u,v) < key[v])
p[v] = u;
key[v] = w(u,v);
15
Prims Algorithm
MST-Prim(G, w, r)
6
4
Q = V[G];
5
10
2
for each u Q
14
key[u] = ;
2
10
key[r] = 0;
0
8
p[r] = NULL;
3
8
3
while (Q not empty)
u
u = ExtractMin(Q);
for each v Adj[u]
if (v Q and w(u,v) < key[v])
p[v] = u;
key[v] = w(u,v);
15
15
Prims Algorithm
u
MST-Prim(G, w, r)
6
4
9
Q = V[G];
5
10
2
for each u Q
14
key[u] = ;
2
10
15
key[r] = 0;
0
8
p[r] = NULL;
3
8
3
while (Q not empty)
u = ExtractMin(Q);
for each v Adj[u]
if (v Q and w(u,v) < key[v])
p[v] = u;
key[v] = w(u,v);
15
Prims Algorithm
u
MST-Prim(G, w, r)
6
4
9
Q = V[G];
5
10
2
for each u Q
14
key[u] = ;
2
10
15
key[r] = 0;
0
8
p[r] = NULL;
3
8
3
while (Q not empty)
u = ExtractMin(Q);
for each v Adj[u]
if (v Q and w(u,v) < key[v])
p[v] = u;
key[v] = w(u,v);
15
Prims Algorithm
u
4
MST-Prim(G, w, r)
6
4
9
Q = V[G];
5
10
2
for each u Q
14
key[u] = ;
2
10
15
key[r] = 0;
0
8
p[r] = NULL;
3
8
3
while (Q not empty)
u = ExtractMin(Q);
for each v Adj[u]
if (v Q and w(u,v) < key[v])
p[v] = u;
key[v] = w(u,v);
15
Prims Algorithm
u
4
MST-Prim(G, w, r)
6
4
9
Q = V[G];
5
5
2
for each u Q
14
key[u] = ;
2
10
15
key[r] = 0;
0
8
p[r] = NULL;
3
8
3
while (Q not empty)
u = ExtractMin(Q);
for each v Adj[u]
if (v Q and w(u,v) < key[v])
p[v] = u;
key[v] = w(u,v);
15
Prims Algorithm
u
4
MST-Prim(G, w, r)
6
4
Q = V[G];
5
5
2
for each u Q
14
key[u] = ;
2
10
key[r] = 0;
0
8
p[r] = NULL;
3
8
3
while (Q not empty)
u = ExtractMin(Q);
for each v Adj[u]
if (v Q and w(u,v) < key[v])
p[v] = u;
key[v] = w(u,v);
15
15
Prims Algorithm
u
4
MST-Prim(G, w, r)
6
4
Q = V[G];
5
5
2
for each u Q
14
key[u] = ;
2
10
key[r] = 0;
0
8
p[r] = NULL;
3
8
3
while (Q not empty)
u = ExtractMin(Q);
for each v Adj[u]
if (v Q and w(u,v) < key[v])
p[v] = u;
key[v] = w(u,v);
15
15
Prims Algorithm
4
MST-Prim(G, w, r)
6
4
Q = V[G];
5
5
2
for each u Q
14
key[u] = ;
2
10
key[r] = 0;
0
8
p[r] = NULL;
3
8
3
while (Q not empty)
u = ExtractMin(Q);
for each v Adj[u]
if (v Q and w(u,v) < key[v])
p[v] = u;
key[v] = w(u,v);
u
9
15
15
Prims Algorithm
4
MST-Prim(G, w, r)
6
4
Q = V[G];
5
5
2
for each u Q
14
key[u] = ;
2
10
key[r] = 0;
0
8
p[r] = NULL;
3
8
3
while (Q not empty)
u = ExtractMin(Q);
for each v Adj[u]
if (v Q and w(u,v) < key[v])
p[v] = u;
key[v] = w(u,v);
9
u
15
15
in this code?