190 likes | 376 Views
G is completely traversed before exploring G and G. 1. 2. 3. Depth-First Search. Idea : Keep going forward as long as there are unseen nodes to be visited. Backtrack when stuck. v. G. 3. G. G. 2. 1. From Computer Algorithms by S. Baase and A. van Gelder.
E N D
G is completely traversed before exploring G and G . 1 2 3 Depth-First Search Idea: Keep going forward as long as there are unseen nodes to be visited. Backtrack when stuck. v G 3 G G 2 1 From Computer Algorithms by S. Baase and A. van Gelder
The DFS Algorithm DFS(G) time 0 // global variable for eachv V(G) do disc(v) unseen for eachv V(G) do if disc(v) = unseen then DFS-visit(v) DFS-visit(v) time time + 1 disc(v) time for eachu Adj(v) do ifdisc(u) = unseen then DFS-visit(u)
8 9 4 10 6 7 5 11 12 A DFS Example time = 1 a h i c d e j f k l b g 2 3
Recursive DFS Calls DFS(G) DFS-visit(a) DFS-visit(b) DFS-visit(g) DFS-visit(e) DFS-visit(f) DFS-visit(c) DFS-visit(d) DFS-visit(h) DFS-visit(i) DFS-visit(j) DFS-visit(k) DFS-visit(l) 1 a c d e 4 6 7 5 f 2 3 b g 8 9 h i 10 j k l DFS-visit(v) explores every unvisited vertex reachable from v before it returns. 12 11
Depth-First Search Forest a h i c d e j f k l b g Edges that, during DFS, lead to an unexplored vertex form a depth-first search forest.
DFS-visit is called exactly once for each node. |V| such calls in total. Each call timestamps a node and then increments the time, which takes O(1) time. Each edge is examined O(1) time. Running Time of DFS O(|V| + |E|)
Edge Classification – Undirected Graphs 1. Tree edges are those in the DFS forest. 2. Back edges go from a vertex to one of its ancestors. a h j b c d i k g l f e
Edge Classification – Directed Graphs Besides tree edges and back edges, there are also 3. Forward edges go from a vertex to one of its descendants. 4. Cross edges: all other edges. a h b c g d e i
Find connected components of G. Determine if G has a cycle. Determine if removing a vertex or edge will disconnect G. Determine if G is planar. … Applications of DFS InO(|V| + |E|)time, we can
a b c v has not been explored at the time of the initial call to DFS-visit(u). v v will be visited before returning from DFS-visit(u). u Back Edge TheoremA directed graph G has a cycle if and only if its DFS forest has a back edge. A back edge leads to a cycle. Proof Suppose there is a cycle. Let u be the vertex with smallest time stamp on the cycle and v be the predecessor of u in the cycle. Therefore at the time of visiting v, a back edge (v, u) is found. The above sufficient and necessary condition carries over to an undirected graph.
root u v Algorithm for Detecting Cycle (v, u) is a back edge if v is a descendant of u in the DFS tree. for eachu Vdo onpath(u) false// on path from the root of the DFS tree DFS-visit(v) time time + 1 disc(v) time onpath(v) true for eachu Adj(v) do ifdisc(u) = unseen then DFS-visit(u) else if onpath(u) then a cycle has been found; halt onpath(v) false// backtrack: v no longer on path from root
Some topological sorts: a b • a, c, e, b, d, g, f • a, b, c, d, g, f, e • b, d, g, a, c, f, e d c e f g Topological Sort of Digraph Ordering < over V(G) such that u < v whenever (u, v) E(G).
Each node represents an activity; e.g., taking a class. (u, v) E(G) implies activity u must be scheduled before activity v. Topological sort schedules all activities. More than one schedule may exist. Intuition: Precedence Diagram
a b Existence of Topological Sort Lemma G can be topologically sorted iff it has no cycle, that is, iff it is a dag(directed acyclic graph). If G has a cycle, then it cannot be topologically sorted. Proof If G has no cycle, then it can be topologically sorted. Constructive proof: An algorithm that sorts any dag. Courtesy: Dr. Fernandez-Baca
Initialize a global queue L within DFS(G) Add a line to DFS-visit Algorithm for Topological Sort DFS-visit-topo(v) time time + 1 disc(v) time for eachu Adj(v) do ifdisc(u) = unseen then DFS-visit(u) L insert(v, L)// insert v in the front of L
u v v u Correctness of the Algorithm Claim Let G be a directed acyclic graph (dag). If (u, v) E(G), then DFS-visit-topo(u) finishes after DFS-visit-topo(v). Proof Consider the time when DFS-visit-topo(u) first scans (u, v): Case 1:DFS-visit-topo(v) has already finished. Obviously, DFS-visit-topo(u) finishes afterwards. And (u, v) is a cross edge. Case 2:DFS-visit-topo(v) has already started, but not yet finished. Then (u, v) is a back-edge and G has a cycle, contradicting that it is a dag!
u v Correctness (cont’d) Case 3: DFS-visit-topo(v) has not yet started. Then the procedure call will start immediately. So (u, v) is a tree edge. Hence DFS-visit-topo(u) will finish after DFS-visit-topo(v). Combining cases 1 and 3, u will always be inserted in front of v in the queue L. Theorem If G is a dag, then at termination of DFS, L is a topological ordering of V(G).