Bridges & Articulation Points
A bridge is an edge whose removal disconnects the graph; an articulation point is a vertex whose removal does. Both are single points of failure in a network.
╌╌╌╌
We have seen depth-first search lay a tree over a graph, and we used that tree to direct edges, find cycles, and decompose a digraph into strongly connected components. This lesson turns the same machinery on a different question, one that matters whenever a graph models a network. Which parts of it are fragile? If a single fiber link is cut or a single router fails, does the network split into pieces that can no longer reach one another? These single points of failure have names.
A graph with no bridges is 2-edge-connected: you must cut at least two edges
to disconnect it, so every pair of vertices is joined by two edge-disjoint paths.
A graph with no articulation points (and at least three vertices) is
2-vertex-connected, or biconnected: two vertex-disjoint paths between every
pair.1 The maximal biconnected subgraphs are the biconnected
components; bridges and cut vertices are exactly the seams where they meet. So
the question where is my network fragile?
is the question find the cut edges and cut vertices,
and the surprise is that one DFS answers it.
The DFS-tree view
Run DFS from any vertex of a connected, undirected graph. Classify each edge by when DFS first traverses it. The decisive structural fact is that only two kinds survive.
This is what makes undirected connectivity tractable: the only way to leave a DFS subtree is a back edge climbing to an ancestor. Bridges and cut vertices are both about whether such an escape exists. To detect it we time the search and track how high each subtree can climb.
In words, is the smallest discovery time reachable from 's DFS subtree using any number of tree edges (downward) plus at most one back edge (the final hop up). It measures the highest ancestor the subtree rooted at can reach without going through 's parent. Both quantities are computed in the same recursion: set on entry, then relax against each child's finished and each back edge's target .
In the figure each node is labeled . The back edge pulls , so the subtrees of and can all climb back above their parents: none of , is a bridge. But is a dead end, , nothing in 's subtree reaches above , so cutting strands . The edge is a bridge too, since 's only escape, the back edge , stays inside 's own subtree.
The bridge criterion
Why. Removing the tree edge separates 's subtree from the rest of the tree. The only edges that could still bind the subtree to the upper graph are back edges out of it. A back edge from inside 's subtree lands on some ancestor with (its lowest reach). If that ancestor is or higher, so an alternative route exists and is not a bridge. If no back edge escapes above through any vertex other than via the edge itself, so cutting it disconnects the subtree: is a bridge. Note the strict inequality: reaching itself () is enough to save the edge.
The articulation criterion
Cut vertices need one more case, because removing deletes all of 's incident edges at once, including the tree edges to each child.
Why the root case. The root has no ancestors, so back edges cannot help. If it has two or more children, those child-subtrees were discovered separately and the only edges joining them ran through the root (cross edges don't exist), so deleting the root splits them. One child means the root is just a leaf-side endpoint and removing it leaves the rest connected.
Why the non-root case. For a non-root , deleting severs child 's subtree from . That subtree stays attached to the rest of the graph only if some back edge climbs strictly above , i.e. . If instead , every escape from 's subtree reaches no higher than itself, so removing isolates that subtree and is a cut vertex. The contrast with the bridge test is exactly the boundary case: a back edge to () saves the edge but does not save the vertex, since deleting destroys that back edge's endpoint too. Hence for bridges, for cut vertices.
Here the back edge gives . The subtree of can climb to but no higher, so holds and is a cut vertex: deleting it strands and from . Yet the edge is not a bridge, since is not strictly greater. The same local data, two thresholds apart, distinguishes fragile edges from fragile vertices.
One DFS finds them all
Both criteria read off and , so a single recursion computes everything. The one subtlety is the parent edge: in an undirected graph the edge back to the parent must not be mistaken for a back edge that lowers . Guarding by parent vertex is correct only when there are no multi-edges (two distinct edges between the same pair); with multi-edges, a second –parent edge is a genuine back edge and the second copy must be allowed to lower . The reliable fix is to track the parent edge id rather than the parent vertex.
- 1;\ \ (0 = unvisited)
- 2for each vertex in do
- 3if thennil = no parent edge
- 4
- 5procedure := id of edge to parent
- 6
- 7
- 8
- 9for each incident edge do
- 10if then continueskip arrival edge
- 11if thentree edge
- 12
- 13
- 14
- 15if then report bridge
- 16if and then mark articulation
- 17elseback edge
- 18
- 19if and then mark articulation
Each vertex is discovered once and each edge is examined a constant number of times (twice over the whole run, once from each endpoint), so the search is , asymptotically free on top of the DFS we were already running. The outer loop over makes it work on disconnected graphs as well: it finds the bridges and cut vertices of every component. The same low-link bookkeeping, with a stack of edges, also peels off the biconnected components directly (pop the stack down to whenever ), which is Tarjan's original formulation.23
Takeaways
- A bridge (cut edge) and an articulation point (cut vertex) are the single points of failure of a network: removing one increases the component count. Their absence is 2-edge-connectivity and 2-vertex-connectivity (biconnectivity); cut edges and vertices are the seams between biconnected components.
- DFS on an undirected graph produces only tree edges and back edges, with no cross or forward edges, so the only way out of a subtree is a back edge to an ancestor.
- The low-link is the smallest discovery time reachable from 's subtree via tree edges plus at most one back edge; compute it alongside in one recursion.
- Bridge criterion: tree edge is a bridge . Articulation criterion: a non-root is a cut vertex some child has ; the root is a cut vertex it has children. The strict-vs-nonstrict gap ( vs ) is the whole distinction.
- A single DFS reports all bridges and cut vertices (and biconnected components). Guard the parent edge by id, not the parent vertex, to stay correct under multi-edges.
Footnotes
- Skiena, § — Graph Traversal / Connectivity: edge- and vertex-connectivity, and articulation vertices as the weak points found by DFS low-links. ↩
- CLRS, Ch. 20 — Elementary Graph Algorithms (DFS): an undirected DFS yields only tree and back edges; the parenthesis/white-path structure that grounds the low-link argument. ↩
- Erickson, Ch. — Depth-First Search: Tarjan's low-link computation for bridges, articulation points, and biconnected components in linear time. ↩
╌╌ END ╌╌