A Bit of History
Robert Tarjan — already met twice in this series for Tarjan's SCC algorithm and the Chu-Liu/Edmonds refinement from the previous deep dive — introduced the low-link-value DFS technique in the very same landmark 1972 paper, "Depth-First Search and Linear Graph Algorithms," that gave the field Tarjan's SCC algorithm. Part 8 defined bridges (edges whose removal disconnects the graph) and articulation points (vertices whose removal disconnects the graph) conceptually, but deferred the actual linear-time detection algorithm to this dedicated deep dive.
Working Principle: Low-Link Values
Run a single DFS, assigning each vertex a discovery time \(disc[v]\) (the order it was first visited) exactly as in Tarjan's SCC algorithm. Alongside this, compute a low-link value \(low[v]\): the smallest discovery time reachable from \(v\)'s DFS subtree using at most one "back edge" (an edge to an ancestor in the DFS tree).
$$low[v] = \min\Big(disc[v],\ \min_{(v,w) \text{ back edge}} disc[w],\ \min_{(v,u) \text{ tree edge}} low[u]\Big)$$
Once every vertex's \(low\) value is computed, two simple tests reveal every bridge and articulation point:
- Bridge test: a tree edge \((u,v)\) (with \(v\) a DFS-child of \(u\)) is a bridge if and only if \(low[v] > disc[u]\) — meaning \(v\)'s entire subtree has no back edge reaching \(u\) or higher, so removing \((u,v)\) truly disconnects it.
- Articulation point test: a non-root vertex \(u\) is an articulation point if it has some DFS-child \(v\) with \(low[v] \geq disc[u]\) (the subtree can reach back to \(u\) itself but no further up, so removing \(u\) strands it); the DFS root is a special case, an articulation point only if it has 2 or more DFS-children.
Key Insight
The subtle difference between the two tests (\(low[v] > disc[u]\) for bridges vs. \(low[v] \geq disc[u]\) for articulation points) reflects a real structural difference: a bridge edge itself must be totally unreachable from below, while an articulation vertex can still be reached by its subtree — it's merely the only way back up, which is exactly what removing it would break.
Worked Example
On a graph shaped like two triangles sharing a single vertex \(C\) (as in the Blossom Algorithm's worked example), a DFS from any starting vertex assigns \(C\) a low-link value that cannot escape below its own discovery time via either triangle alone — marking \(C\) as an articulation point (removing it disconnects the two triangles), while every edge within either triangle fails the bridge test (each triangle offers an alternate back-edge route around any single edge), correctly identifying zero bridges but one articulation point in this graph.
Correctness
The correctness argument mirrors Tarjan's SCC algorithm's own low-link reasoning: \(low[v]\) precisely captures "the highest ancestor \(v\)'s subtree can reach without going through \(v\)'s parent edge." If that value never climbs above \(u\)'s own discovery time, no back edge from \(v\)'s subtree bypasses \(u\) — meaning \(u\) (for articulation points) or the edge \((u,v)\) (for bridges) is structurally essential to keeping that subtree connected to the rest of the graph, exactly the definitions from Part 8.
Complexity Analysis
A single DFS pass computes both discovery times and low-link values together, with each edge examined a constant number of times:
$$\text{Time: } O(V + E) \qquad \text{Space: } O(V)$$
Linear time — matching Tarjan's SCC algorithm's own bound, and confirming that finding every single point of failure in a network costs no more than simply traversing it once.
Implementation
Real-World Applications
Network Infrastructure Resilience Auditing
Telecommunications and power-grid operators run bridge and articulation-point detection directly against their infrastructure topology graphs to identify single points of failure — a single bridge cable or articulation-point substation whose failure would partition the network — and prioritize redundant backup connections specifically at those structurally critical locations, rather than uniformly across the whole network.
Exercises
- Trace through the worked example (two triangles sharing vertex \(C\)) by hand, computing discovery times and low-link values for every vertex.
- Explain in your own words why the DFS root needs a special-case rule (articulation point only if it has 2+ children) that non-root vertices don't need.
- Construct a small graph with exactly one bridge and no articulation points, and explain why this combination is impossible (hint: think about what a bridge implies about its endpoints).
- Challenge: Modify the implementation to also compute the block-cut tree (previewed in Part 8) directly from the articulation points and 2-edge-connected components found.
Limitations
Undirected Graphs Only
This specific low-link formulation applies to undirected graphs — bridges and articulation points as defined here don't directly generalize to directed graphs, where the analogous "strong bridge" and "strong articulation point" concepts require meaningfully different algorithms built on top of strongly connected components (Tarjan's SCC algorithm) rather than this simpler single-pass technique.