Download as pdf or txt
Download as pdf or txt
You are on page 1of 7

--

--

Articulation Points and Biconnected Components

Suppose you are a terrorist, seeeking to distroy a telephone network !!! Which station would you blow up ?
b a d c

articulation point
e h

network of stations
f

Articulation point - Any vertex whose removal results in a disconnected graph - If v is an articulation point, then there exist distinct vertices w and x such that v is in every path from w to x

Biconnected graph - Any graph which contains no articulation points - Biconnected graphs have at least two vertex-disjoint paths between any pair of vertices - To disconnect a biconnected graph, we must remove at least two vertices - We can generalize the above concepts to k-connected graphs (k vertices must be removed to disconnect the graph)

--

--

-2 Biconnected components of a graph - A maximal biconnected subgraph (i.e., not contained in any larger biconnected subgraph) - Note that biconnected components partition the edges (not the vertices !!) into disjoint sets - DFS can be used to nd the biconnected components of a graph
A graph G I B C E H A F J D H A E E F F J D B C G I B Its biconnected components

A brute-force approach to nd articulation points 1. Delete a vertex 2. Apply DFS on the remaining vertices to see if the graph is connected 3. Choose a new vertex and apply steps (1) and (2) - Running time: O(V(V+E)) (not very efcient, it can be done in O(V+E) time !!!)

--

--

-3 Theorem: In a depth-rst search tree, a vertex v, other than the root, is an articulation point iff v is not a leaf and some subtree of v has no back edge to a proper ancestor of v
DFS tree

v v is an articulation point since the right subtree of v does not have a back edge to a proper ancestor !!

(===>) Suppose that v is an articulation There exist x and y such that v is in every path from x to y At least one of x and y must be a descendant of v (or v will not be in the path) This implies that v cannot be a leaf (proof by contradiction) Suppose that every subtree has a back edge to an ancestor of v Case 1: only one of the x and y is a descendant of v
y and v are in different subtrees y and v are in the same subtree

...
y

...
v y

...
v

...
x

--

--

-4Case 2: both x and y are descendants of v


x and y are descendants of v but belong in different subtrees x and y are descendants of v but belong in ... the same subtree v v cannot disconnect them in this case!! y

...
v

... ...
x x

...

Both cases lead us to the conclusion that v is not an articulation point (Contradiction !!) (<===) Suppose that some subtree of v has no back edge to a proper ancestor of v Since v is not a leaf, there exist vertices x and y such that v is in the path from x to y There is only one path from x to y since there are no back edges Removing v will disconnect x from y; thus, v is an articulation point !!

--

--

-5 Algorithm (for undirected graphs) - Apply DFS to compute the DFS tree - Key idea: keep track of how far back in the tree one can get from each vertex by following tree edges and certain back edges
1 A

Its DFS tree

A graph G I B C E H A
source

2 D

3 F 4

J 10 H 9

J D

5 B

G 7
6

C I 8

- First, assign a number to each vertex based on the time at which the vertex is visited for the rst time (discovery[v]) - Then, keep track of how back in the tree one can get from a vertex (back[v]) - back[v] is initialized to discovery[v] in the beginning - How should we update back[v] and how should we detect articulation points ?

--

--

-6-

Case 2 Case 1 v backtrack back-edge back[w] = min(back[w], discovery[v]) w if back[w] < discovery[v] back[v] = min(back[v], back[w]) else if back[w] >= discovery[v] v is an articulation point !! w v

A D F
discovery[E]=4 back[E]=4

A D F

discovery[A]=1 back[A]=1 discovery[D]=2 back[D]=2 back-edge discovery[F]=3 back[F]=3

A
D

D
F

discovery[F]=3 back[F]=1 (=discovery[A])

E B C
discovery[C]=6 back[C]=4 (=discovery[E])

B discovery[B]=5
back[B]=5 back-edge

C back[C]=6 A D F E B C
backtrack back[C] < discovery[B] discovery[B]=5 back[B]=4 (=back[C])

discovery[C]=6

A D F E B C I

A D F E B G C I
back-edge discovery[I]=8 back[I]=5 (=discovery[B])

discovery[G]=7

G back[G]=7
discovery[I]=8 back[I]=8

--

--

-7A D F E
backtrack

A D F E B G C I

backtrack back[G] = discovery[B] biconnected component remove it from the tree

B G C I A

back[I] < discovery[G] discovery[G]=7 back[G]=5 (=back[I])

A D D F E B C
backtrack backtrack back[E] > discovery[F] back[B] = discovery[E]

A D F
discovery[H]=9 back[H]=9

F
biconnected component

E
biconnected component remove it from the tree

remove it from the tree

A D F H
back-edge

A D
back[H] < discovery[F] discovery[H]=9 back[H]=1 (=discovery[A])

A D F H J
discovery[J]=10 back[J]=10

F H
backtrack

discovery[F]=3 back[F]=1 (=back[H])

A D
discovery[J]=10

A D J H
back-edge backtrack back[J]=2 (=discovery[D])

A
back[F] < discovery[D] discovery[D]=2

D
back[J] < discovery[F] discovery[F]=3 back[F]=1

back[D]=1 (=back[F])

F H

backtrack

F H

A
back[D] = discovery[A] backtrack

D F H J

biconnected component remove it from the tree

You might also like