1 / 63

CS 332: Algorithms

CS 332: Algorithms. Topological Sort Minimum Spanning Trees. Review: Breadth-First Search. BFS(G, s) { initialize vertices; Q = {s}; // Q is a queue (duh); initialize to s while (Q not empty) { u = RemoveTop(Q); for each v  u->adj {

andrew
Download Presentation

CS 332: Algorithms

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. CS 332: Algorithms Topological Sort Minimum Spanning Trees David Luebke 13/10/2014

  2. Review: Breadth-First Search BFS(G, s) { initialize vertices; Q = {s}; // Q is a queue (duh); initialize to s while (Q not empty) { u = RemoveTop(Q); for each v  u->adj { if (v->color == WHITE) v->color = GREY; v->d = u->d + 1; v->p = u; Enqueue(Q, v); } u->color = BLACK; } } v->d represents depth in tree v->p represents parent in tree David Luebke 23/10/2014

  3. DFS(G) { for each vertex u  G->V { u->color = WHITE; } time = 0; for each vertex u  G->V { if (u->color == WHITE) DFS_Visit(u); } } 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; } Review: DFS Code David Luebke 33/10/2014

  4. Review: DFS Example sourcevertex David Luebke 43/10/2014

  5. Review: DFS Example sourcevertex d f 1 | | | | | | | | David Luebke 53/10/2014

  6. Review: DFS Example sourcevertex d f 1 | | | 2 | | | | | David Luebke 63/10/2014

  7. Review: DFS Example sourcevertex d f 1 | | | 2 | | 3 | | | David Luebke 73/10/2014

  8. Review: DFS Example sourcevertex d f 1 | | | 2 | | 3 | 4 | | David Luebke 83/10/2014

  9. Review: DFS Example sourcevertex d f 1 | | | 2 | | 3 | 4 5 | | David Luebke 93/10/2014

  10. Review: DFS Example sourcevertex d f 1 | | | 2 | | 3 | 4 5 | 6 | David Luebke 103/10/2014

  11. Review: DFS Example sourcevertex d f 1 | 8 | | 2 | 7 | 3 | 4 5 | 6 | David Luebke 113/10/2014

  12. Review: DFS Example sourcevertex d f 1 | 8 | | 2 | 7 | 3 | 4 5 | 6 | David Luebke 123/10/2014

  13. Review: DFS Example sourcevertex d f 1 | 8 | | 2 | 7 9 | 3 | 4 5 | 6 | David Luebke 133/10/2014

  14. Review: DFS Example sourcevertex d f 1 | 8 | | 2 | 7 9 |10 3 | 4 5 | 6 | David Luebke 143/10/2014

  15. Review: DFS Example sourcevertex d f 1 | 8 |11 | 2 | 7 9 |10 3 | 4 5 | 6 | David Luebke 153/10/2014

  16. Review: DFS Example sourcevertex d f 1 |12 8 |11 | 2 | 7 9 |10 3 | 4 5 | 6 | David Luebke 163/10/2014

  17. Review: DFS Example sourcevertex d f 1 |12 8 |11 13| 2 | 7 9 |10 3 | 4 5 | 6 | David Luebke 173/10/2014

  18. Review: DFS Example sourcevertex d f 1 |12 8 |11 13| 2 | 7 9 |10 3 | 4 5 | 6 14| David Luebke 183/10/2014

  19. Review: DFS Example sourcevertex d f 1 |12 8 |11 13| 2 | 7 9 |10 3 | 4 5 | 6 14|15 David Luebke 193/10/2014

  20. Review: DFS Example sourcevertex d f 1 |12 8 |11 13|16 2 | 7 9 |10 3 | 4 5 | 6 14|15 David Luebke 203/10/2014

  21. Review: Kinds Of Edges • Thm: If G is undirected, a DFS produces only tree and back edges • Thm: An undirected graph is acyclic iff a DFS yields no back edges • Thus, can run DFS to find cycles David Luebke 213/10/2014

  22. Review: Kinds of Edges sourcevertex d f 1 |12 8 |11 13|16 2 | 7 9 |10 3 | 4 5 | 6 14|15 Tree edges Back edges Forward edges Cross edges David Luebke 223/10/2014

  23. DFS And Cycles • Running time: O(V+E) • We can actually determine if cycles exist in O(V) time: • In an undirected acyclic forest, |E|  |V| - 1 • So count the edges: if ever see |V| distinct edges, must have seen a back edge along the way • Why not just test if |E| <|V| and answer the question in constant time? David Luebke 233/10/2014

  24. Directed Acyclic Graphs • A directed acyclic graph or DAG is a directed graph with no directed cycles: David Luebke 243/10/2014

  25. DFS and DAGs • Argue that a directed graph G is acyclic iff a DFS of G yields no back edges: • Forward: if G is acyclic, will be no back edges • Trivial: a back edge implies a cycle • Backward: if no back edges, G is acyclic • Argue contrapositive: G has a cycle   a back edge • Let v be the vertex on the cycle first discovered, and u be the predecessor of v on the cycle • When v discovered, whole cycle is white • Must visit everything reachable from v before returning from DFS-Visit() • So path from uv is yellowyellow, thus (u, v) is a back edge David Luebke 253/10/2014

  26. Topological Sort • Topological sort of a DAG: • Linear ordering of all vertices in graph G such that vertex u comes before vertex v if edge (u, v)  G • Real-world example: getting dressed David Luebke 263/10/2014

  27. Getting Dressed Underwear Socks Watch Pants Shoes Shirt Belt Tie Jacket David Luebke 273/10/2014

  28. Getting Dressed Underwear Socks Watch Pants Shoes Shirt Belt Tie Jacket Socks Underwear Pants Shoes Watch Shirt Belt Tie Jacket David Luebke 283/10/2014

  29. Topological Sort Algorithm Topological-Sort() { Run DFS When a vertex is finished, output it Vertices are output in reverse topological order } • Time: O(V+E) • Correctness: Want to prove that (u,v)  G  uf > vf David Luebke 293/10/2014

  30. Correctness of Topological Sort • Claim: (u,v)  G  uf > vf • When (u,v) is explored, u is yellow • v = yellow  (u,v) is back edge. Contradiction (Why?) • v = white  v becomes descendent of u  vf < uf (since must finish v before backtracking and finishing u) • v = black  v already finished  vf < uf David Luebke 303/10/2014

  31. Minimum Spanning Tree • Problem: given a connected, undirected, weighted graph: 6 4 5 9 14 2 10 15 3 8 David Luebke 313/10/2014

  32. Minimum Spanning Tree • Problem: given a connected, undirected, weighted graph, find a spanning tree using edges that minimize the total weight 6 4 5 9 14 2 10 15 3 8 David Luebke 323/10/2014

  33. Minimum Spanning Tree • Which edges form the minimum spanning tree (MST) of the below graph? A 6 4 5 9 H B C 14 2 10 15 G E D 3 8 F David Luebke 333/10/2014

  34. Minimum Spanning Tree • Answer: A 6 4 5 9 H B C 14 2 10 15 G E D 3 8 F David Luebke 343/10/2014

  35. 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) David Luebke 353/10/2014

  36. Minimum Spanning Tree • Thm: • Let T be MST of G, and let A  T be subtree of T • Let (u,v) be min-weight edge connecting A to V-A • Then (u,v)  T David Luebke 363/10/2014

  37. Minimum Spanning Tree • Thm: • Let T be MST of G, and let A  T be subtree of T • Let (u,v) be min-weight edge connecting A to V-A • Then (u,v)  T • Proof: in book (see Thm 24.1) David Luebke 373/10/2014

  38. Prim’s 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); David Luebke 383/10/2014

  39. Prim’s 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); 6 4 9 5 14 2 10 15 3 8 Run on example graph David Luebke 393/10/2014

  40. Prim’s 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);  6 4 9 5    14 2 10 15    3 8  Run on example graph David Luebke 403/10/2014

  41. Prim’s 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);  6 4 9 5    14 2 10 15 r 0   3 8  Pick a start vertex r David Luebke 413/10/2014

  42. Prim’s 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);  6 4 9 5    14 2 10 15 u 0   3 8  Red vertices have been removed from Q David Luebke 423/10/2014

  43. Prim’s 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);  6 4 9 5    14 2 10 15 u 0   3 8 3 Red arrows indicate parent pointers David Luebke 433/10/2014

  44. Prim’s 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);  6 4 9 5 14   14 2 10 15 u 0   3 8 3 David Luebke 443/10/2014

  45. Prim’s 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);  6 4 9 5 14   14 2 10 15 0   3 8 3 u David Luebke 453/10/2014

  46. Prim’s 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);  6 4 9 5 14   14 2 10 15 0 8  3 8 3 u David Luebke 463/10/2014

  47. Prim’s 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);  6 4 9 5 10   14 2 10 15 0 8  3 8 3 u David Luebke 473/10/2014

  48. Prim’s 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);  6 4 9 5 10   14 2 10 15 0 8  3 8 3 u David Luebke 483/10/2014

  49. Prim’s 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);  6 4 9 5 10 2  14 2 10 15 0 8  3 8 3 u David Luebke 493/10/2014

  50. Prim’s 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);  6 4 9 5 10 2  14 2 10 15 0 8 15 3 8 3 u David Luebke 503/10/2014

More Related