dfs search on undirected graphs
play

DFS Search on Undirected Graphs Algorithm : Design & Analysis - PowerPoint PPT Presentation

DFS Search on Undirected Graphs Algorithm : Design & Analysis [13] In the last class Directed Acyclic Graph Topological Order Critical Path Analysis Strongly Connected Component Strong Component and Condensation


  1. DFS Search on Undirected Graphs Algorithm : Design & Analysis [13]

  2. In the last class… � Directed Acyclic Graph � Topological Order � Critical Path Analysis � Strongly Connected Component � Strong Component and Condensation � Leader of Strong Component � The Algorihtm

  3. DFS Search on Undirected Graph � Undirected and Symmetric Digraph � UDF Search Skeleton � Biconnected Components � Articulation Points and Biconnectedness � Biconnected Component Algorithm � Analysis of the Algorithm

  4. What’s the Different for Undirected � The issue related to traversals for undirected graph is that one edge may be traversed for two times in opposite directions . � For an undirected graph, the depth-first search provides an orientation for each of its edges; they are oriented in the direction in which they are first encountered.

  5. Nontree edges in symmetric digraph � Cross edge: not existing. � Back edge: � Back to the direct parent: second encounter � Otherwise: first encounter � Forward edge: always second encounter, and first time as back edge

  6. Modifications to the DFS Skeleton � All the second encounter are bypassed. � So, the only substantial modification is for the possible back edges leading to an ancestor, but not direct parent. � We need know the parent , that is, the direct ancestor, for the vertex to be processed.

  7. DFS Skeleton for Undirected Graph � int dfsSweep(IntList[] adjVertices , int n, …) int ans; � <Allocate color array and initialize to white> � For each vertex v of G, in some order � if (color[v]==white) � int vAns= dfs( adjVertices , color, v, -1, …); � <Process vAns> � // Continue loop � Recording the parent return ans; �

  8. DFS Skeleton for Undirected Graph int dfs(IntList[] adjVertices , int [] color, int v, int p, …) � int w; IntList remAdj; int ans; � In all other cases, the In all other cases, the color[v]=gray; � edges are the second edges are the second <Preorder processing of vertex v> � encounter, so, ignored. remAdj= adjVertices [v]; encounter, so, ignored. � while (remAdj ≠ nil) � w=first(remAdj); � if (color[w]==white) � <Exploratory processing for tree edge vw> � int wAns=dfs( adjVertices , color, w, v …); � < Backtrack processing for tree edge vw , using wAns> � else if (color[w]==gray && w ≠ p) � <Checking for nontree edge vw> � remAdj=rest(remAdj); � <Postorder processing of vertex v, including final computation of ans> � color[v]=black; � return ans; �

  9. Complexity of Undirected DFS � If each inserted statement for specialized application runs in constant time, the time cost is the same as for directed DFS, that is Θ ( m + n ). � Extra space is in Θ ( n ) for array color , or activation frames of recursion.

  10. Definition of Biconnected Components � Biconnected component � Biconnected graph � Bicomponent: a maximal biconnected subgraph � Articulation point � v is an articulation point if it is in every path from w to x ( w , x are vertices different from v ) � A connected graph is biconnected if and only if it has no articulation points.

  11. G Bicomponents I B B G C I Partitioning the set of edges, not of E B the vertices C E E F H F J H F J A D A D

  12. Bicomponent Algorithm: the Idea Ancestors of v v is an articulation point v is an articulation point if and only if no back if and only if no back If v is the articulation If v is the articulation edges linking any vertex edges linking any vertex point farthest away from point farthest away from v in w -rooted subtree and in w -rooted subtree and the root on the branch, the root on the branch, any ancestor of v. then one bicomponent is any ancestor of v. then one bicomponent is w detected. detected. Subtree rooted at w Back edge

  13. Keeping the Track of Backing � Tracking data � For each vertex v , a local variable back is used to store the required information, as the value of discoverTime of some vertex. � Testing for bicomponent � At backtracking from w to v , the condition implying a bicomponent is: wBack ≥ discoverTime ( v ) (where wBack is the returned back value for w )

  14. Which means: the back value of v is the smallest discover time a back edge Updating the value of back “sees” from any subtree of v. And, when this value is not larger than � v first discovered the discover time of v , we know that there is at least one subtree of v back = discoverTime ( v ) connected to other part of the graph only by v . � Trying to explore, but a back edge vw from v encountered back= min (back, discoverTime(w)) � Backtracking from w to v back =min( back, wback )

  15. Bicomponent: an Example second back edge encountered G G I I 5/5 B B C C 6/6 E E 4/4 3/ 1 3/3 H F J H F J 2/2 A D A D 2/2 1/1 1/1 first back edge encountered

  16. Bicomponent: an Example 8/8 G 9/9 G backtracking third back edge I I encountered 5/ 4 B 5/ 4 B C C E 6/ 4 4/4 E 6/ 4 4/4 3/ 1 3/ 1 H F J H F J A D A D 1/1 2/2 1/1 2/2

  17. Bicomponent: an Example 8/ 5 G 8/ 5 9/ 5 backtracking: G 9/ 5 gBack=discoverTime(B), I backtracking I so, first bicomponent 5/ 4 B 5/ 4 B detected. C C E 6/ 4 4/4 E 6/ 4 4/4 3/ 1 3/ 1 H F J H F J A D A D 1/1 2/2 1/1 2/2

  18. Bicomponent: an Example 8/ 5 G 9/ 5 I Backtracking from B to E: 5/ 4 B bBack=discoverTime(E), so, C the second bicomponent is detect E 6/ 4 4/4 14/ 1 3/ 1 16/ 2 H F J Backtracking from E to F: eBack>discoverTime(F), so, A D the third bicomponent is detect 1/1 2/2

  19. Bicomponent Algorithm: Core � int bicompDFS( v ) color[v]=gray; time++; discoverTime[v]=time; � back=discoverTime[v] ; � Outline of while (there is an untraversed edge vw ) � core procedure <push vw into edgeStack > � if ( vw is a tree edge) � wBack=bicompDFS( w ); � if (wBack ≥ discoverTime[ v ]) � Output a new bicomponent � by popping edgeStack down through vw ; � back=min(back, wBack) ; � else if ( vw is a back edge) � back=min(discoverTime[v], back) ; � time++; finishTime[v]=time; color[v]=black; � � return back;

  20. Correctness of Bicomponent Algorithm � We have seen that: � If v is the articulation point farthest away from the root on the branch, then one bicomponent is detected. � So, we need only prove that: � In a DFS tree, a vertex(not root) v is an articulation point if and only if (1) v is not a leaf; (2) some subtree of v has no back edge incident with a proper ancestor of v .

  21. Characteristics of Articulation Point � In a DFS tree, a vertex(not root) v is an articulation point if and only if (1) v is not a leaf; (2) some subtree of v has no back edge incident with a proper ancestor of v . � ⇐ Trivial � ⇒ � By definition, v is on every path between some x , y (different from v ). � At least one of x , y is a proper descendent of v (otherwise, x ↔ root ↔ y not containing v ). � By contradiction, suppose that every subtree of v has a back edge to a proper ancestor of v , we can find a xy -path not containing v for all possible cases(only 2 cases)

  22. Case 1 Case 1.2: another is an ancestor of v suppose that every subtree y of v has a back edge to a proper ancestor y v v of v, and, exactly one of x x , y is a descendant of v . x Case 1.1: another is not an ancestor of v

  23. Case 2 suppose that every subtree of v has a back v edge to a proper ancestor of v, and, both x , y are descendants of v . y x

  24. Home Assignments � pp.380- � 7.28 � 7.35 � 7.37 � 7.38 � 7.40

Download Presentation
Download Policy: The content available on the website is offered to you 'AS IS' for your personal information and use only. It cannot be commercialized, licensed, or distributed on other websites without prior consent from the author. To download a presentation, simply click this link. If you encounter any difficulties during the download process, it's possible that the publisher has removed the file from their server.

Recommend


More recommend