Arian Soleimanzadeh
  • Home
  • Blog
  • Podcasts
  • Videos
  • Contact
العربيةArabic
DeutschGerman
EnglishEnglish
فارسیPersian
한국어Korean
中文Chinese
Panel•Quick Contact

Languages

Choose your interface locale

ar

العربية

Arabic

de

Deutsch

German

en

English

English

fa

فارسی

Persian

ko

한국어

Korean

zh

中文

Chinese

Get Appointment

Drop a quick message — I’ll reply as soon as possible.

LinkedInFast response
Home/Articles/Articulation Points: Tarjan, Low-Link and Critical Network Vertices
AlgorithmsGraph AlgorithmsArticle

Articulation Points: Tarjan, Low-Link and Critical Network Vertices

A complete guide to articulation points with DFS, discovery times, low-link values, root and non-root conditions, bridges, biconnected graphs, and real-world reliability analysis.

August 21, 202614 min read2 Views
#Graph#Algorithms#Articulation Points#Cut Vertex#Tarjan#DFS#Low Link#JavaScript#TypeScript

Arian Soleimanzadeh

Software Engineer & Researcher

Articulation Points and critical graph vertices visual guide

Arian Soleimanzadeh

AI · Code · Product

Research + Engineering
On this page
Computer networksData centersTransportation networksSocial graphsInfrastructure analysis

An Articulation Point, also called a Cut Vertex, is a vertex in an undirected graph whose removal increases the number of connected components.

In practical terms, it is a structural single point of failure.

If the vertex disappears, parts of the graph that were previously connected may become separated.

Example

Code
123
A -- B -- C
     |
     D

Removing B disconnects the remaining vertices.

Therefore:

Code
1
B = articulation point

Articulation Point vs Bridge

An articulation point is a critical vertex.

A bridge is a critical edge.

Code
12
Articulation Point → remove vertex
Bridge             → remove edge

Brute-force approach

A simple approach removes each vertex one at a time and recomputes connected components.

Its cost can reach:

Code
1
O(V × (V + E))

A DFS-based Tarjan method finds all articulation points in linear time.

Discovery and low-link values

For each vertex u:

Code
1
disc[u]

is the time when DFS first discovers it.

Code
1
low[u]

is the earliest discovery time reachable from u's DFS subtree through tree edges and a back edge.

Low-link values tell us whether a subtree has an alternate route to an ancestor.

Non-root condition

For a DFS tree edge:

Code
1
u → v

if u is not the root and:

Code
1
low[v] >= disc[u]

then u is an articulation point.

The subtree rooted at v cannot reach an ancestor above u without passing through u.

Root condition

The DFS root follows a separate rule.

It is an articulation point when it has more than one DFS child:

Code
1
children > 1

JavaScript implementation

JavaScript
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
function findArticulationPoints(graph) {
  const nodes = new Set();

  for (const [u, neighbors] of Object.entries(graph)) {
    nodes.add(u);

    for (const v of neighbors) {
      nodes.add(v);
    }
  }

  const visited = new Set();
  const disc = new Map();
  const low = new Map();
  const parent = new Map();
  const articulation = new Set();

  let time = 0;

  function dfs(u) {
    visited.add(u);

    disc.set(u, ++time);
    low.set(u, disc.get(u));

    let children = 0;

    for (const v of graph[u] ?? []) {
      if (!visited.has(v)) {
        children++;
        parent.set(v, u);

        dfs(v);

        low.set(
          u,
          Math.min(low.get(u), low.get(v))
        );

        const isRoot = !parent.has(u);

        if (isRoot && children > 1) {
          articulation.add(u);
        }

        if (
          !isRoot &&
          low.get(v) >= disc.get(u)
        ) {
          articulation.add(u);
        }
      } else if (v !== parent.get(u)) {
        low.set(
          u,
          Math.min(low.get(u), disc.get(v))
        );
      }
    }
  }

  for (const node of nodes) {
    if (!visited.has(node)) {
      dfs(node);
    }
  }

  return [...articulation];
}

Why >= matters

For a bridge:

Code
1
low[v] > disc[u]

For an articulation point:

Code
1
low[v] >= disc[u]

If the subtree can only return to u itself, removing u still disconnects the subtree.

Cycles and redundancy

A cycle can provide an alternate route.

For a triangle:

Code
1234
A
|\
| \
B--C

no vertex is an articulation point.

Removing any one vertex leaves the other two connected.

Common structures

Chain:

Code
1
A -- B -- C -- D

Internal vertices such as B and C are articulation points.

Star:

Code
12345
    B
    |
C -- A -- D
    |
    E

The center A is an articulation point.

Complete graphs with at least three vertices have no articulation point.

Real-world applications

Computer networks

Routers and switches can be vertices and links can be edges.

Articulation points reveal devices whose failure partitions the network.

Data centers

Critical gateways or network devices can be identified structurally and then protected with redundancy.

Transportation networks

Stations or intersections that connect otherwise separate regions may be articulation points.

Social graphs

A person or organization can be the only structural connector between two groups.

Infrastructure analysis

Articulation-point analysis can provide an initial structural view of single points of failure.

Important modeling caveat

Real systems may include failover, capacity, direction, load balancing, physical constraints, or probabilistic failure.

Articulation-point analysis only reflects the graph model provided.

It should therefore be treated as a structural connectivity analysis, not a complete reliability model.

Biconnected graphs

An undirected connected graph with no articulation point is biconnected or 2-vertex-connected.

Removing any single vertex does not disconnect it.

Biconnected components

Articulation points separate a graph into biconnected blocks.

These structures are useful for graph decomposition and connectivity queries.

Block-cut tree

A graph can be transformed into a block-cut tree containing:

  • articulation-point nodes,
  • biconnected-component nodes.

This gives a higher-level view of graph structure.

Articulation point vs centrality

Articulation points are binary:

Code
1
critical / not critical

Betweenness centrality measures how often a vertex lies on shortest paths.

A vertex can have high centrality without being an articulation point.

Undirected graph assumption

The classic low-link algorithm described here applies to undirected graphs.

Directed cut-vertex problems have different connectivity semantics and require different treatment.

Edge cases

  • one vertex,
  • two vertices,
  • disconnected graphs,
  • DFS root with one child,
  • DFS root with multiple children,
  • self-loops,
  • parallel edges / multigraphs.

For multigraphs, tracking only the parent vertex may be insufficient; edge IDs are safer.

Complexity

With adjacency lists:

Code
12
Time:  O(V + E)
Space: O(V)

This is much better than brute-force removal.

TypeScript

TypeScript
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
type Graph = Record<string, string[]>;

function findArticulationPoints(
  graph: Graph
): string[] {
  const nodes = new Set<string>();

  for (const [u, neighbors] of Object.entries(graph)) {
    nodes.add(u);

    for (const v of neighbors) {
      nodes.add(v);
    }
  }

  const visited = new Set<string>();
  const disc = new Map<string, number>();
  const low = new Map<string, number>();
  const parent = new Map<string, string>();
  const result = new Set<string>();

  let time = 0;

  function dfs(u: string): void {
    visited.add(u);

    disc.set(u, ++time);
    low.set(u, disc.get(u)!);

    let children = 0;

    for (const v of graph[u] ?? []) {
      if (!visited.has(v)) {
        children++;
        parent.set(v, u);

        dfs(v);

        low.set(
          u,
          Math.min(low.get(u)!, low.get(v)!)
        );

        const isRoot = !parent.has(u);

        if (isRoot && children > 1) {
          result.add(u);
        }

        if (
          !isRoot &&
          low.get(v)! >= disc.get(u)!
        ) {
          result.add(u);
        }
      } else if (v !== parent.get(u)) {
        low.set(
          u,
          Math.min(low.get(u)!, disc.get(v)!)
        );
      }
    }
  }

  for (const node of nodes) {
    if (!visited.has(node)) {
      dfs(node);
    }
  }

  return [...result];
}

Common mistakes

  • using the bridge condition > instead of articulation condition >=,
  • forgetting the separate DFS-root rule,
  • treating the parent edge as a back edge,
  • processing only one connected component,
  • applying the undirected algorithm directly to directed graphs,
  • assuming high degree automatically means critical,
  • ignoring destination-only vertices,
  • mishandling parallel edges.

Summary

Articulation points reveal critical vertices whose removal increases the number of connected components.

The Tarjan-style DFS uses:

Code
12
disc[u]
low[u]

For a non-root vertex:

Code
1
low[child] >= disc[u]

indicates that the parent can be an articulation point.

For a DFS root:

Code
1
more than one DFS child

is the critical condition.

The algorithm runs in:

Code
1
O(V + E)

and is a fundamental tool for structural reliability and connectivity analysis.

On this page
Computer networksData centersTransportation networksSocial graphsInfrastructure analysis

Article details

Publication metadata, reading time and live view information.

Published

August 21, 2026

Updated

August 23, 2026

Reading time

14 min read

Views

2

Author

Arian Soleimanzadeh

Previous article

Topological Sorting: Kahn, DFS, DAGs and Real-World Dependency Ordering

Next article

Bridges in Graphs: Tarjan, Low-Link and Critical Network Edges

Arian Soleimanzadeh

Personal portfolio focused on modern web engineering, UI systems, and practical AI products — clean code, clean design.

Quick Links

  • About
  • Blog
  • Contact

Contact

  • soleimanzadeh.a.work@gmail.com
  • soleimanzadeh.uni@gmail.com

Availability: Weekdays

Typically replies within 24h.

Newsletter

Get updates on posts, projects, and new releases.

© 2026 ariansoleimanzadeh.site — All rights reserved.

LinkedIn