1 / 26

Theory of Computing

Theory of Computing. Lecture 6 MAS 714 Hartmut Klauck. Traversing Graphs. We are given a graph G=(V,E) Starting vertex s The goal is to traverse the graph , i.e., to visit each vertex at least once For example to find a marked vertex t or decide if t is reachable from s

kiora
Download Presentation

Theory of Computing

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. Theory of Computing Lecture 6 MAS 714 Hartmut Klauck

  2. Traversing Graphs • Wearegiven a graph G=(V,E) • Startingvertex s • The goalisto traverse thegraph, i.e., tovisiteachvertexat least once • Forexampleto find a markedvertex t ordecideif t isreachablefrom s • Twovariants: • Breadth First Search (BFS) • Depth First Search (DFS)

  3. Traversing Graphs • Common tobothprocedures: • Use a datastructurewiththefollowingoperations: • Insert a vertex • Remove a vertex • Maintain an activevertex (startwith s) • Maintain an arrayofverticesalreadyvisited • Then: • Insert all (unvisited) neighborsoftheactivevertex, markitasvisited • Remove a vertex v and make it active

  4. The Datastructure • Wedistinguishbytherulethatdeterminesthenextactivevertex • Alternative 1: queue • FIFO (first in first out) • Alternative 2: stack • LIFO (last in first out)

  5. Result • Alternative 1: FIFO • Breadth First Search • Neighborsof s will bevisitedbeforetheirneighbors etc. • Alternative 2: LIFO • Depth First Search • Insert neighbors, last neighborbecomesactive, theninserthisneighbors, last neighborbecomesactive etc.

  6. Traversing Graphs • Withbothmethodseventually all reachableverticesarevisited • Different applications: • BFS canbeusedto find shortedpaths in unweightedgraphs • DFS canbeusedtotopologicallysort a directedacyclicgraph

  7. Depth First Search • If we use a stack as datastructure we get Depth First Search (DFS) • Typically, DFS will maintain some extra information: • Time when v is put on the stack • Time, when all neighbors of v have been examined • This information is useful for applications

  8. Datastructure: Stack • A stack is a linked list together with two operations • push(x,S): Insert element x at the front of the list S • pop(S): Remove the front element of the list S • Implementation: • Need to maintain only the pointer to the front of the stack • Useful to also have • peek(S): Find the front element but don’t remove

  9. Digression: Recursion and Stacks • Our model of Random Access Machines does not directly allow recursion • Neither does any real hardware • Compilers will “roll out” recursive calls • Put all local variables of the calling procedure in a safe place • Execute the call • Return the result and restore the local variables

  10. Recursion • The best datastructure for this is a stack • Push all local variables to the stack • LIFO functionality is exactly the right thing • Example: Recursion tree of Quicksort

  11. DFS • Procedure: • For all v: • ¼(v)=NIL, d(v)=0, f(v)=0 • Enter s into the stack S, set TIME=1, d(s)=TIME • While S is not empty • v=peek(S) • Find the first neighbor w of v with d(w)=0: • push(w,S) , ¼(w)=v, TIME=TIME+1, d(w)=TIME • If there is no such w: pop(S), TIME=TIME+1, f(v)=TIME

  12. DFS • The array d(v) holds the time we first visit a vertex. • The array f(v) holds the time when all neighbors of v have been processed • “discovery” and “finish” • In particular, when d(v)=0 then v has not been found yet

  13. Simple Observations • Vertices are given d(v) numbers between 1 and 2n • Each vertex is put on the stack once, and receives the f(v) number once all neighbors are visited • Running time is O(n+m)

  14. A recursive DFS • Stacks are there to roll out recursion • Consider the procedure in a recursive way! • Furthermore we can start DFS from all unvisited vertices to traverse the whole graph, not just the vertices reachable from s • We also want to label edges • The edges in (¼(v),v) form trees: tree edges • We can label all other edges as • back edges • cross edges • forward edges

  15. Edge classification • Lemma: the edges (¼(v),v) form a tree • Definition: • Edges going down along a path in a tree (but not tree edge) are forward edges • Edges going up along a path in a tree areback edges • Edges across paths/tree are cross edges • A vertex v is a descendant of u if there is a path of tree edges from u to v • Observation: descendants are discovered after their “ancestors” but finish before them

  16. Example: edge labeling • Tree edges, Back edges, Forward edges, Cross edges

  17. Recursive DFS • DFS(G): • TIME=1 (global variable) • For all v: ¼(v)=NIL, d(v)=0, f(v)=0 • For all v: if d(v)=0 then DFS(G,v) • DFS(G,v) • TIME=TIME+1, d(v)=TIME • For all neighbors w of v: • If d(w)=0 then (v,w) is tree edge, DFS(G,w) • If d(w)0 and f(w)0 then cross edge or forward edge • If d(w)0 and f(w)=0 then back edge • TIME=TIME+1, f(v)=TIME

  18. Recursive DFS • How to decide if forward or cross edge? • Assume, (v,w) is an edge and f(w) is not 0 • If d(w)>d(v) then forward edge • If d(v)>d(w) then cross edge

  19. Application 1: Topological Sorting • A DAG is a directed acyclic graph • A partial order on vertices • A topological sorting of a DAG is a numbering of vertices s.t. all edges go from smaller to larger vertices • A total order that is consistent with the partial order

  20. DAGs • Lemma: G is a DAG iff there are no back edges • Proof: • If there is a back edge, then there is a cycle • The other direction: suppose there is a cycle c • Let u be the first vertex discovered on c • v is u’s predecessor on c • Then v is a descendant of u, i.e., d(v)>d(u) and f(v)<f(u) • When edge (v,u) is processed: f(u)=0, d(v)>d(u) • Thus (v,u) is a back edge

  21. Topological Sorting • Algorithm: • Output the vertices in the reverse order of the f(v) as the topological sorting of G • I.e., put the v into a list when they finish in DFS, so that the last finished vertex is first in list

  22. Topological Sorting • We need to prove correctness • Certainly we provide a total ordering of vertices • Now assume vertex i is smaller than j in the ordering • I.e., i finished after j • Need to show: there is no path from j to i • Proof: • j finished means all descendants of j are finished • Hence iis not a descendant of j (otherwise i finishes first) • If j is a descendant of ithen a path from j to i must contain a back edge (but those do not exist in a DAG) • If j is not a descendant of i then a path from j to i contains a cross edge, but then f(i)< f(j)

  23. Topological Sorting • Hence we can compute a topological sorting in linear time

  24. Application 2: Strongly connected components • Definition: • A strongly connected component of a graph G is a maximal set of vertices V’ such that for each pair of vertices v,w in V’ there is a path from v to w • Note: in undirected graphs this corresponds to connected components, but herewe have one-way roads • Strongly connected components (viewed as vertices) form a DAG inside a graph G

  25. Stronglyconnectedcomponents • Algorithm • Use DFS(G) to compute finish times f(v) for all v • Compute GT [Transposed graph: edges (u,v) replaced by (v,u)] • Run DFS(GT), but in the DFS procedure go over vertices in order of decreasing f(v) from the first DFS • Vertices in a tree generated by DFS(GT) form a strongly connected component

  26. Stronglyconnectedcomponents • Time: O(n+m) • Weskipthecorrectnessproof • Note theusefulnessofthe f(v) numberscomputed in thefirst DFS

More Related