Download presentation
Presentation is loading. Please wait.
Published byMadeleine Stone Modified over 9 years ago
1
CSC 413/513: Intro to Algorithms Graph Algorithms DFS
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
3
Depth-First Search ● Vertices initially colored white ● Then colored gray when discovered ● Then black when finished
4
Depth-First Search: The Code 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; }
5
Depth-First Search: The Code 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; } What does u->d represent?
6
Depth-First Search: The Code 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; } What does u->f represent?
7
Depth-First Search: The Code 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; } Will all vertices eventually be colored black?
8
DFS Example source vertex
9
DFS Example 1 | | | | | | | | source vertex d f
10
DFS Example 1 | | | | | | 2 | | source vertex d f
11
DFS Example 1 | | | | |3 | 2 | | source vertex d f
12
DFS Example 1 | | | | |3 | 4 2 | | source vertex d f
13
DFS Example 1 | | | |5 |3 | 4 2 | | source vertex d f
14
DFS Example 1 | | | |5 | 63 | 4 2 | | source vertex d f
15
DFS Example 1 |8 | | |5 | 63 | 4 2 | 7 | source vertex d f
16
DFS Example 1 |8 | | |5 | 63 | 4 2 | 7 | source vertex d f
17
DFS Example 1 |8 | | |5 | 63 | 4 2 | 79 | source vertex d f What is the structure of the grey vertices? What do they represent?
18
DFS Example 1 |8 | | |5 | 63 | 4 2 | 79 |10 source vertex d f
19
DFS Example 1 |8 |11 | |5 | 63 | 4 2 | 79 |10 source vertex d f
20
DFS Example 1 |128 |11 | |5 | 63 | 4 2 | 79 |10 source vertex d f
21
DFS Example 1 |128 |1113| |5 | 63 | 4 2 | 79 |10 source vertex d f
22
DFS Example 1 |128 |1113| 14|5 | 63 | 4 2 | 79 |10 source vertex d f
23
DFS Example 1 |128 |1113| 14|155 | 63 | 4 2 | 79 |10 source vertex d f
24
DFS Example 1 |128 |1113|16 14|155 | 63 | 4 2 | 79 |10 source vertex d f
25
Depth-First Search: The Code 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; } What will be the running time?
26
Depth-First Search: The Code 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; } Running time: O(n 2 ) because call DFS_Visit on each vertex, and the loop over Adj[] can run as many as |V| times
27
Depth-First Search: The Code 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; } BUT, there is actually a tighter bound. How many times will DFS_Visit() actually be called?
28
Depth-First Search Analysis ● For a node u ■ DFS_Visit(u) cannot be called more than once ■ DFS_Visit(u) cannot be called less than once ■ Therefore, exactly once ● DFS_Visit(u) requires c + (|Adj(u)|) time ■ The fact that recursive calls are made to v’s is accounted for by DFS_Visit(v) ● Total= ∑ u ( c + (|Adj(u)|) ) = (V+E) ■ Considered linear in input size, since adjacency list is a (V+E) representation
29
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?
30
DFS Example 1 |128 |1113|16 14|155 | 63 | 4 2 | 79 |10 source vertex d f Tree edges
31
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)
32
DFS Example 1 |128 |1113|16 14|155 | 63 | 4 2 | 79 |10 source vertex d f Tree edgesBack edges
33
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 ○ If forward edge, then grey node to black node Converse not true; could be a cross edge (see next)
34
DFS Example 1 |128 |1113|16 14|155 | 63 | 4 2 | 79 |10 source vertex d f Tree edgesBack edgesForward edges
35
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 or within trees ○ (Also) from a grey node to a black node ○ No ancestor-descendent relation, if in the same DFS tree
36
DFS Example 1 |128 |1113|16 14|155 | 63 | 4 2 | 79 |10 source vertex d f Tree edgesBack edgesForward edgesCross edges
37
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
38
DFS: Kinds Of Edges ● Thm 22.10: 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?
39
DFS: Kinds Of Edges ● Thm 22.10: 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 tree vertex, before other vertex is explored ○ So in fact the picture is wrong…both lower tree edges cannot in fact be tree edges source C?
40
DFS And Graph Cycles ● Thm: An undirected graph is acyclic iff a DFS yields no back edges ■ If acyclic, then no back edges (because a back edge implies a cycle) ■ If no back edges, then 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
41
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; } If v->color == GREY and Pred(u)≠v, …
42
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; }
43
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 if no cycle, then O(V+E) is O(V) ■ If cycle, count the edges: if ever see |V| distinct edges, must have seen a back edge along the way ○ Can halt and output “cycle exists” ○ O(V) time
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.