1 / 44

ITCS 6114

ITCS 6114. Graph Algorithms . Depth-First Search. Depth-first search is another strategy for exploring a graph Explore “deeper” in the graph whenever possible Edges are explored out of the most recently discovered vertex v that still has unexplored edges

dallon
Télécharger la présentation

ITCS 6114

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. ITCS 6114 Graph Algorithms 16/7/2014

  2. Depth-First Search • Depth-first search is another strategy for exploring a graph • Explore “deeper” in the graph whenever possible • Edges are explored out of the most recently discovered vertex v that still has unexplored edges • When all of v’s edges have been explored, backtrack to the vertex from which v was discovered 26/7/2014

  3. Depth-First Search • Vertices initially colored white • Then colored gray when discovered • Then black when finished 36/7/2014

  4. 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 = GREY; 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; } Depth-First Search: The Code 46/7/2014

  5. 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 = GREY; 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; } Depth-First Search: The Code What does u->d represent? 56/7/2014

  6. 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 = GREY; 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; } Depth-First Search: The Code What does u->f represent? 66/7/2014

  7. 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 = GREY; 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; } Depth-First Search: The Code Will all vertices eventually be colored black? 76/7/2014

  8. 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 = GREY; 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; } Depth-First Search: The Code What will be the running time? 86/7/2014

  9. 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 = GREY; 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; } Depth-First Search: The Code Running time: O(n2) because call DFS_Visit on each vertex, and the loop over Adj[] can run as many as |V| times 96/7/2014

  10. 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 = GREY; 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; } Depth-First Search: The Code BUT, there is actually a tighter bound. How many times will DFS_Visit() actually be called? 106/7/2014

  11. 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 = GREY; 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; } Depth-First Search: The Code So, running time of DFS = O(V+E) 116/7/2014

  12. Depth-First Sort Analysis • This running time argument is an informal example of amortized analysis • “Charge” the exploration of edge to the edge: • Each loop in DFS_Visit can be attributed to an edge in the graph • Runs once/edge if directed graph, twice if undirected • Thus loop will run in O(E) time, algorithm O(V+E) • Considered linear for graph, b/c adj list requires O(V+E) storage • Important to be comfortable with this kind of reasoning and analysis 126/7/2014

  13. DFS Example sourcevertex 136/7/2014

  14. DFS Example sourcevertex d f 1 | | | | | | | | 146/7/2014

  15. DFS Example sourcevertex d f 1 | | | 2 | | | | | 156/7/2014

  16. DFS Example sourcevertex d f 1 | | | 2 | | 3 | | | 166/7/2014

  17. DFS Example sourcevertex d f 1 | | | 2 | | 3 | 4 | | 176/7/2014

  18. DFS Example sourcevertex d f 1 | | | 2 | | 3 | 4 5 | | 186/7/2014

  19. DFS Example sourcevertex d f 1 | | | 2 | | 3 | 4 5 | 6 | 196/7/2014

  20. DFS Example sourcevertex d f 1 | 8 | | 2 | 7 | 3 | 4 5 | 6 | 206/7/2014

  21. DFS Example sourcevertex d f 1 | 8 | | 2 | 7 | 3 | 4 5 | 6 | 216/7/2014

  22. DFS Example sourcevertex d f 1 | 8 | | 2 | 7 9 | 3 | 4 5 | 6 | What is the structure of the grey vertices? What do they represent? 226/7/2014

  23. DFS Example sourcevertex d f 1 | 8 | | 2 | 7 9 |10 3 | 4 5 | 6 | 236/7/2014

  24. DFS Example sourcevertex d f 1 | 8 |11 | 2 | 7 9 |10 3 | 4 5 | 6 | 246/7/2014

  25. DFS Example sourcevertex d f 1 |12 8 |11 | 2 | 7 9 |10 3 | 4 5 | 6 | 256/7/2014

  26. DFS Example sourcevertex d f 1 |12 8 |11 13| 2 | 7 9 |10 3 | 4 5 | 6 | 266/7/2014

  27. DFS Example sourcevertex d f 1 |12 8 |11 13| 2 | 7 9 |10 3 | 4 5 | 6 14| 276/7/2014

  28. DFS Example sourcevertex d f 1 |12 8 |11 13| 2 | 7 9 |10 3 | 4 5 | 6 14|15 286/7/2014

  29. DFS Example sourcevertex d f 1 |12 8 |11 13|16 2 | 7 9 |10 3 | 4 5 | 6 14|15 296/7/2014

  30. DFS: Kinds of edges • DFS introduces an important distinction among edges in the original graph: • Tree edge: encounter new (white) vertex • The tree edges form a spanning forest • Can tree edges form cycles? Why or why not? 306/7/2014

  31. DFS Example sourcevertex d f 1 |12 8 |11 13|16 2 | 7 9 |10 3 | 4 5 | 6 14|15 Tree edges 316/7/2014

  32. DFS: Kinds of edges • DFS introduces an important distinction among edges in the original graph: • Tree edge: encounter new (white) vertex • Back edge: from descendent to ancestor • Encounter a grey vertex (grey to grey) 326/7/2014

  33. DFS Example sourcevertex d f 1 |12 8 |11 13|16 2 | 7 9 |10 3 | 4 5 | 6 14|15 Tree edges Back edges 336/7/2014

  34. DFS: Kinds of edges • DFS introduces an important distinction among edges in the original graph: • Tree edge: encounter new (white) vertex • Back edge: from descendent to ancestor • Forward edge: from ancestor to descendent • Not a tree edge, though • From grey node to black node 346/7/2014

  35. DFS Example 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 356/7/2014

  36. DFS: Kinds of edges • DFS introduces an important distinction among edges in the original graph: • Tree edge: encounter new (white) vertex • Back edge: from descendent to ancestor • Forward edge: from ancestor to descendent • Cross edge: between a tree or subtrees • From a grey node to a black node 366/7/2014

  37. DFS Example 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 376/7/2014

  38. DFS: Kinds of edges • DFS introduces an important distinction among edges in the original graph: • Tree edge: encounter new (white) vertex • Back edge: from descendent to ancestor • Forward edge: from ancestor to descendent • Cross edge: between a tree or subtrees • Note: tree & back edges are important; most algorithms don’t distinguish forward & cross 386/7/2014

  39. DFS: Kinds Of Edges • Thm 23.9: If G is undirected, a DFS produces only tree and back edges • Proof by contradiction: • Assume there’s a forward edge • But F? edge must actually be a back edge (why?) source F? 396/7/2014

  40. DFS: Kinds Of Edges • Thm 23.9: If G is undirected, a DFS produces only tree and back edges • Proof by contradiction: • Assume there’s a cross edge • But C? edge cannot be cross: • must be explored from one of the vertices it connects, becoming a treevertex, before other vertex is explored • So in fact the picture is wrong…bothlower tree edges cannot in fact betree edges source C? 406/7/2014

  41. DFS And Graph Cycles • Thm: An undirected graph is acyclic iff a DFS yields no back edges • If acyclic, no back edges (because a back edge implies a cycle • If no back edges, acyclic • No back edges implies only tree edges (Why?) • Only tree edges implies we have a tree or a forest • Which by definition is acyclic • Thus, can run DFS to find whether a graph has a cycle 416/7/2014

  42. DFS And Cycles • How would you modify the code to detect cycles? 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 = GREY; 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; } 426/7/2014

  43. DFS And Cycles • What will be the running time? 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 = GREY; 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; } 436/7/2014

  44. DFS And Cycles • What will be the running time? • A: 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 446/7/2014

More Related