Depth-First Search: COMP171 Fall 2005
Depth-First Search: COMP171 Fall 2005
Depth-first search
Graph / Slide 2
DFS can provide certain information about the graph that BFS cannot
Graph / Slide 3
DFS Algorithm
DFS
Graph / Slide 4
DFS Algorithm
Flag all vertices as not visited
Graph / Slide 5
Example
Adjacency List Visited Table (T/F)
0
0 8
source
F F F F F F
1 2
3 4 5
1
3 4 5
7
6
6
7 8 9
F
F F F
Graph / Slide 6
Example
Adjacency List 0 8
source
F F T F F F
2 1 3 7
4 5
F
F F F
6 5
7 8 9
Graph / Slide 7
Example
0
8
source
Adjacency List
F F T F F F
3 4 5
1
3 4 5 7 6
6
7 8 9
F
F T F
2 -
mark Pred[8]
Graph / Slide 8
Example
0
8
source
Adjacency List
T F T F F F
8 -
3 4 5
1
3 4 5 7 6
6
7 8 9
F
F T F
2 -
Mark Pred[0]
Graph / Slide 9
Example
0
source
Back to 8 8
Adjacency List
T F T F F F
8 -
3 4 5
1
3 4 5 7 6
6
7 8 9
F
F T F
2 -
Pred
Recursive calls
Graph / Slide 10
Example
0
8
source
Adjacency List
T F T F F F
8 -
3 4 5
1
3 4 5 7 6
6
7 8 9
F
F T T
2 8
Mark Pred[9]
Graph / Slide 11
Example
0
8
source
Adjacency List
T T T F F F
8 9 -
3 4 5
1
3 4 5 7 6
6
7 8 9
F
F T T
2 8
Mark Pred[1]
Graph / Slide 12
Example
0
8
source
Adjacency List
T T T T F F
8 9 1 -
3 4 5
1
3 4 5 7 6
6
7 8 9
F
F T T
2 8
Mark Pred[3]
Graph / Slide 13
Example
0
8
source
Adjacency List
T T T T T F
8 9 1 3 -
3 4 5
1
3 4 5 7 6
6
7 8 9
F
F T T
2 8
Pred
Recursive calls
RDFS( 2 ) Mark 4 as visited RDFS(8) RDFS(9) Mark Pred[4] RDFS(1) RDFS(3) RDFS(4) STOP all of 4s neighbors have been visited return back to call RDFS(3)
Graph / Slide 14
Example
0
8
source
Adjacency List
T T T T T F
8 9 1 3 -
3 4 5
1
3 4 Back to 3 RDFS( 2 ) RDFS(8) RDFS(9) RDFS(1) RDFS(3) visit 5 -> RDFS(5) 5 7 6
6
7 8 9
F
F T T
2 8
Pred
Recursive calls
Graph / Slide 15
Example
0
8
source
Adjacency List
T T T T T T
8 9 1 3 3
3 4 5
1
3 4 5 7 6
6
7 8 9
F
F T T
2 8
Pred
Recursive calls
RDFS( 2 ) RDFS(8) Mark 5 as visited RDFS(9) Mark Pred[5] RDFS(1) RDFS(3) RDFS(5) 3 is already visited, so visit 6 -> RDFS(6)
Graph / Slide 16
Example
0
8
source
Adjacency List
T T T T T T
8 9 1 3 3
3 4 5
1
3 4 5 7 6
6
7 8 9
T
F T T
5
2 8
Recursive calls
RDFS( 2 ) RDFS(8) RDFS(9) RDFS(1) RDFS(3) RDFS(5) RDFS(6) visit 7 -> RDFS(7)
Pred
Mark 6 as visited
Mark Pred[6]
Graph / Slide 17
Example
0
8
source
Adjacency List
T T T T T T
8 9 1 3 3
3 4 5
1
3 4 5 7 6
6
7 8 9
T
T T T
5
6 2 8
Recursive calls
Pred RDFS( 2 ) RDFS(8) Mark 7 as visited RDFS(9) RDFS(1) Mark Pred[7] RDFS(3) RDFS(5) RDFS(6) RDFS(7) -> Stop no more unvisited neighbors
Graph / Slide 18
Example
Adjacency List 0 Visited Table (T/F)
0
T T T T T T
8 9 1 3 3
8
source
1 2
2 1 3
4 5
7
6 5
6
7 8 9
T
T T T
5
6 2 8
Recursive calls
Pred
Graph / Slide 19
Example
Adjacency List 0 Visited Table (T/F)
0
T T T T T T
8 9 1 3 3
8
source
1 2
2 1 3
4 5
7
6 5
6
7 8 9
T
T T T
5
6 2 8
Recursive calls
Pred
Graph / Slide 20
Example
Adjacency List 0 Visited Table (T/F)
0
T T T T T T
8 9 1 3 3
8
source
1 2
2 1 3
4 5
7
6 5
6
7 8 9
T
T T T
5
6 2 8
Recursive calls
Pred
Graph / Slide 21
Example
Adjacency List 0 Visited Table (T/F)
0
T T T T T T
8 9 1 3 3
8
source
1 2
2 1 3
4 5
7
6 5
6
7 8 9
T
T T T
5
6 2 8
Recursive calls
Pred
Graph / Slide 22
Example
Adjacency List 0 Visited Table (T/F)
0
T T T T T T
8 9 1 3 3
8
source
1 2
2 1 3
4 5
7
6 5
6
7 8 9
T
T T T
5
6 2 8
Recursive calls
Pred
Graph / Slide 23
Example
Adjacency List 0 Visited Table (T/F)
0
T T T T T T
8 9 1 3 3
8
source
1 2
2 1 3
4 5
7
6 5
6
7 8 9
T
T T T
5
6 2 8
Pred
Graph / Slide 24
Example
Adjacency List 0 Visited Table (T/F)
0
T T T T T T
8 9 1 3 3
8
source
1 2
2 1 3
4 5
7
6 5
6
7 8 9
T
T T T
5
6 2 8
Pred
Graph / Slide 25
Example
0 8
source
Adjacency List
T T T T T T
8 9 1 3 3
2 1 3 7
2 3 4 5
6 5
6
7 8 9
T
T T T
5
6 2 8
Check our paths, does DFS find valid paths? Yes. Try some examples. Path(0) -> Path(6) -> Path(7) ->
Pred
Graph / Slide 26
We never visited a vertex more than once We had to examine all edges of the vertices
So, the running time of DFS is proportional to the number of edges and number of vertices (same as BFS)
O(n + m)
O(|v|+|e|)
Graph / Slide 27
DFS Tree
Resulting DFS-tree. Notice it is much deeper than the BFS tree.
Captures the structure of the recursive calls - when we visit a neighbor w of v, we add w as child of v - whenever DFS returns from a vertex v, we climb up in the tree from v to its parent