200 likes | 247 Views
Understand biconnected components in graphs, implement iterative DFS, identify separating vertices, compute low and pre numbers, analyze connectivity and perform biconnected component computation.
E N D
Biconnected Components CS 312
Objectives • Formulate problems as problems on graphs • Implement iterative DFS • Describe what a biconnected component is • Be ready to start project 2
Problems on Graphs • What to store in each node of the graph? • What does it mean for two nodes to be connected in the graph? • What property do I want to analyze about the graph? • Then select or adapt an algorithm.
Generic graph exploration Explore (G, v) Input: G = (V,E) and v in V Output: visited(u) is true u for all u reachable from v. visited(v) = true previsit(v) for each edge (v,u) E if not visited(u) then explore (u) postvisit(v)
Iterative DFS version ExploreIterDFS(G, v) Input: G = (V,E) and v in V Output: visited(u) is true u for all u reachable from v. stack.push(v) if (stack.notEmpty()) v = stack.top visited(v) = true previsit(v) for the next edge (v,u) E if not visited(u) then stack.push(u) if all edges from v have been traversed then stack.pop(v) postvisit(v)
Iterative DFS version ExploreIterDFS(G, v) Input: G = (V,E) and v in V Output: visited(u) is true u for all u reachable from v. stack.push(v) if (stack.notEmpty()) v = stack.top visited(v) = true previsit(v) for the next edge (v,u) E if not visited(u) then stack.push(u) if all edges from v have been traversed then stack.pop(v) postvisit(v)
Definitions • Biconnected component • The largest set of edges such that… • There is a set of EDGES for which there is a simple cycle between every edge • Or it is a single edge • Bridge • Bicconnected component of size 1 • Separating vertex • Vertex which can be deleted to partition the graph.
Example a f g b e c d
Example a f g b e c d
“Low” numbering • “pre” ordering • “low” numbering
Separating Vertices How does that translate into a test on low and pre?
The Idea for the Algorithm • If you can find low and pre, you can identify separating vertices. • You can use DFS to find low and pre. • Pre is easy. • If you can find separating vertices, then you can use a second DFS to find biconnected components. • Keep in mind that the biconnected components are edges not vertices.
Example a a b g f ab bg gc cd dg pop g b e c d h e f c d h
Example a a,1 b,2 g,3 f pre numbering. g b e c,4 d,5 h,6 e,7 f,8 c d h
Example a a,1,1 b,2,1 g,3,3 f low numbering. g b e c,4,3 d,5,3 h,6,6 e,7,3 f,8,3 c u is a sep. vertex iff there is a child v of u s.t. pre(u) “< or =“ low(v) d h
Example a a,1,1 b,2,1 g,3,3 f h,6,6 d,5,5 c,4,4 g,3,3 b,2,2 a,1,1 (vertex, pre, lowest low so far) g b e c,4,3 d,5,5 h,6,6 e,7,3 f,8,8 c d h Computing low. Always initialize u.low = u.pre When follow edge (u,v) and v is visited (and v != the DFS parent of u), u.low = min (u.low, v.pre) When pop u off DFS stack, pass low to parent. If u’s low is lower than it’s parent, then update parent.
Example a d is visited but, d is h’s dfs parent Do nothing. a,1,1 b,2,1 g,3,3 f d,5,5 h,6,6 d,5,5 c,4,4 g,3,3 b,2,2 a,1,1 (vertex, pre, lowest low so far) g b e c,4,3 d,5,5 h,6,6 e,7,3 f,8,8 c d h Computing low. Always initialize u.low = u.pre When follow edge (u,v) and v is visited, u.low = min (u.low, v.pre) When pop u off DFS stack, pass low to parent. If u’s low is lower than it’s parent, then update parent.
Example a d is visited but, d is h’s dfs parent Do nothing. a,1,1 b,2,1 g,3,3 f d,5,5 h,6,6 d,5,5 c,4,4 g,3,3 b,2,2 a,1,1 (vertex, pre, lowest low so far) g b e c,4,3 d,5,5 h,6,6 e,7,3 f,8,8 c d h Computing components 2nd DFS use a stack of edges. push a mark onto the edge stack with the child of a SV when pop the child of an SV (in the node stack) pop back to the mark.