1 / 19

Biconnected Components

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?

jgaston
Download Presentation

Biconnected Components

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. Biconnected Components CS 312

  2. Objectives • Formulate problems as problems on graphs • Implement iterative DFS • Describe what a biconnected component is • Be ready to start project 2

  3. 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.

  4. 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)

  5. 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)

  6. 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)

  7. 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.

  8. Example a f g b e c d

  9. Example a f g b e c d

  10. DFS Tree

  11. “Low” numbering • “pre” ordering • “low” numbering

  12. Separating Vertices How does that translate into a test on low and pre?

  13. 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.

  14. Example a a b g f ab bg gc cd dg  pop g b e c d h e f c d h

  15. 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

  16. 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

  17. 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.

  18. 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.

  19. 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.

More Related