Fact-checked by Grok 2 weeks ago

Tarjan's strongly connected components algorithm

Tarjan's strongly connected components algorithm is a linear-time algorithm that identifies the strongly connected components (SCCs) of a , where an SCC is a maximal subgraph in which every pair of vertices is mutually reachable via directed paths, using a single depth-first search (DFS) traversal augmented with discovery times and low-link values to detect component roots. Developed by Robert Tarjan and published in 1972, the represents a foundational advancement in theory by achieving O(V + E) time complexity—linear in the number of vertices V and edges E—through elegant use of a stack to track active vertices and extract components in reverse topological order. At a high level, the algorithm performs a DFS while assigning each a discovery time (the order in which it is first visited) and a low-link value (the smallest discovery time reachable from the subtree rooted at that vertex, including itself, via tree edges, back edges, or cross edges). A becomes the root of an SCC if its low-link value equals its discovery time, at which point all vertices from the current stack position up to that root are popped to form the component. This approach avoids the need for multiple passes over the graph, distinguishing it from other methods like Kosaraju's algorithm, which requires two DFS traversals (one on the original graph and one on its transpose). The algorithm's efficiency and simplicity have made it a cornerstone of algorithmic , influencing subsequent work on parallel and distributed SCC detection as well as applications in areas like , , and compiler optimization. Tarjan's innovation builds on prior DFS-based techniques for related problems, such as finding biconnected components, and has been formally verified in proof assistants like and Isabelle to confirm its correctness. Despite its age, the algorithm remains widely implemented in libraries and tools due to its optimal asymptotic performance and low constant factors in practice.

Introduction

Purpose and overview

Tarjan's strongly connected components algorithm addresses the problem of identifying strongly connected components (SCCs) in a directed graph. An SCC is defined as a maximal subgraph where every pair of vertices is mutually reachable, meaning there exists a directed path from any vertex u to any vertex v and vice versa within the component. The algorithm achieves this through a single-pass depth-first search (DFS) traversal of the graph. During the traversal, it computes discovery times for each vertex, along with low-link values that track the smallest discovery time reachable from the subtree rooted at that vertex, including itself. Vertices are pushed onto a stack as they are discovered, and SCCs are identified and popped from the stack when a vertex's low-link value indicates the end of a component, outputting them in reverse postorder. This approach ensures linear , O(V + E), where V is the number of vertices and E is the number of edges, making it highly efficient for processing large-scale graphs. The algorithm's efficiency supports key applications, such as network analysis for detecting tightly knit communities in or communication networks, where SCCs reveal groups with strong mutual connectivity, and compiler optimization, where SCCs in graphs identify loops and interprocedural dependencies to enable and other transformations. Developed by , the algorithm was introduced in his 1972 paper, providing a foundational linear-time solution that leverages principles for decomposition.

Historical context

Tarjan's strongly connected components algorithm was introduced by in his seminal 1972 paper titled " and Linear Algorithms," published in the SIAM on Computing. This work presented an efficient, linear-time method for identifying strongly connected components in directed using a single traversal, marking a significant advancement in algorithm design. The algorithm built upon earlier depth-first search techniques developed by John Hopcroft and Robert Tarjan in their 1971 paper "Efficient Algorithms for Graph Manipulation," which explored linear-time procedures for connected and biconnected components in graphs. This foundational collaboration emphasized DFS as a versatile tool for graph analysis, influencing Tarjan's extension to directed graphs and strongly connected components. In the broader context of emerging graph algorithms, Tarjan's single-pass approach contrasted with the two-pass DFS method later proposed by S. Rao Kosaraju in 1978, which also achieved linear-time complexity but required graph transposition. Tarjan's contributions, including this algorithm, earned him the inaugural Rolf Nevanlinna Prize in 1982 from the , recognizing his development of near-optimal algorithms for graph-theoretic problems. The algorithm's elegance and efficiency have cemented its status as a cornerstone in education and research, frequently taught in algorithms courses for its demonstration of DFS-based linear-time solutions. Since its publication, the core structure of Tarjan's algorithm has remained largely unchanged, though implementations have incorporated minor optimizations, such as those by Nuutila and Soisalon-Soininen in 1993 for improved space efficiency in computations. It is widely integrated into open-source libraries, including NetworkX in , which employs a nonrecursive variant with Nuutila's modifications, and the Boost Graph Library in C++, which implements the original DFS-based version.

Background Concepts

Strongly connected components

In a directed graph G = (V, E), a strongly connected component (SCC) is defined as a maximal S \subseteq V such that for every pair of distinct vertices u, v \in S, there exists a directed path from u to v and from v to u. This mutual reachability ensures that the subgraph induced by S is as interconnected as possible within the directed structure. SCCs exhibit key properties that facilitate analysis. Trivial SCCs are single- components (with or without a self-loop), for which strong connectivity holds vacuously if there is no self-loop or via the self-loop if present. In contrast, non-trivial SCCs involve multiple vertices and necessarily contain at least one directed , enabling the bidirectional paths required for strong connectivity. The collection of all SCCs in G partitions the set V, and contracting each SCC into a single supernode yields the condensation , which is always a (DAG) with edges representing connections between distinct SCCs in the original . To illustrate, consider a with vertices labeled 1 through 5 and edges 1 → 2, 2 → 3, 3 → 1, 3 → 4, and 4 → 5. Here, vertices {1, 2, 3} form a non-trivial SCC due to the cycle 1-2-3-1, while {4} and {5} are trivial SCCs, as no cycles connect them bidirectionally to others. The graph would then be a DAG with supernodes {1,2,3} → {4} → {5}. SCCs play a crucial role in directed graph decomposition, serving as a prerequisite for tasks such as —performed on the acyclic graph to order the components—and identifying feedback arc sets, where cycles are confined within individual SCCs, allowing targeted removal to acyclicize the graph. Tarjan's algorithm provides an efficient linear-time method for computing these components.

Depth-first search foundations

Depth-first search (DFS) is a fundamental that systematically explores a by starting at an arbitrary source and recursively visiting the deepest unvisited before to explore alternative paths. This recursive approach mimics a depth-oriented exploration, prioritizing complete branches over breadth, and is particularly efficient for directed graphs represented using adjacency lists, where each maintains a list of its outgoing to facilitate in constant time per edge. In practice, DFS constructs a spanning consisting of one or more trees, each rooted at a starting , with the forest covering all reachable from the chosen sources. A core aspect of DFS involves assigning timestamps to vertices to track the traversal order: the discovery time records when a vertex is first encountered and added to the stack, while the finishing time marks when the recursion unwinds after exploring all its adjacent vertices. These timestamps enable the analysis of the graph's structure relative to the traversal order, forming the basis for detecting properties like and cycles. In directed graphs, back edges—those pointing from a vertex to one of its ancestors in the DFS —play a crucial role in identifying cycles, as they indicate a path back to a previously visited vertex within the same tree branch. Edges encountered during DFS are classified into four categories based on the timestamps of their endpoints, providing insight into the graph's connectivity:
  • Tree edges: Form the backbone of the DFS forest, connecting a to an unvisited during .
  • Back edges: Link a to an in the current DFS , signaling a .
  • Forward edges: Connect a to a descendant in the DFS that is not directly its child.
  • Cross edges: Point to a in a different DFS or a finished branch in the same .
These DFS forests and the detection of back edges serve as essential prerequisites for advanced graph algorithms, including Tarjan's method for finding strongly connected components.

Algorithm Mechanics

Data structures and bookkeeping

Tarjan's algorithm relies on a set of auxiliary data structures to manage the traversal and maintain the necessary state for identifying strongly connected components in a . These structures facilitate tracking discovery, connectivity reachability, and the active path during . The primary data structures include a that holds along the current path from the root of the DFS tree, ensuring that only relevant nodes are considered for component formation. An disc[] records the discovery time of each , assigned sequentially as vertices are first visited. Complementing this, the low[] stores low-link values for each , though their computation is handled separately. Additionally, a onStack[] tracks whether a given is currently present on the . For further bookkeeping, the algorithm uses an index counter to generate unique timestamps for discovery, starting from 0 and incrementing with each new vertex encountered. An output list or collection accumulates the identified strongly connected components as they are finalized. Parent tracking occurs implicitly through the recursive DFS calls, linking each vertex to its predecessor in the search tree. Initialization is straightforward: the disc[] and low[] arrays are filled with -1 to indicate unvisited vertices, the onStack[] array is set to false for all vertices, and the stack begins empty. The algorithm operates within the recursive framework of depth-first search to process the graph. Together, these elements allow the to efficiently pinpoint the roots of strongly connected components by monitoring membership and traversal order, avoiding redundant examinations of nodes. In Tarjan's for finding strongly connected components (SCCs) in a , the low-link value, denoted as \low(u) for a u, represents the smallest time (or vertex number) of any reachable from u, including u itself. This includes vertices reachable via descendants in the (DFS) tree through tree edges or back edges, as well as ancestors reachable via back edges. The low-link value captures the earliest point in the DFS numbering that can be accessed from the subtree rooted at u, enabling the detection of cycles that connect back to ancestors. The computation of \low(u) proceeds recursively during the DFS traversal. Specifically, \low(u) = \min(\disc(u), \min\{\low(v) \mid (u, v) \text{ is a tree edge to child } v\}, \min\{\disc(w) \mid (u, w) \text{ is a back edge to ancestor } w\}), where \disc(u) is the discovery time of u. Initially, \low(u) is set to \disc(u), and it is updated after processing each child v by taking the minimum with \low(v), and upon encountering a back edge to w by taking the minimum with \disc(w). This rule ensures that \low(u) propagates information about the lowest reachable discovery time upward through the DFS tree, reflecting potential cycles. A key data structure in the algorithm is a stack that maintains the vertices along the current DFS path from the root to the active vertex. The stack invariant states that it contains exactly the vertices in the current path, with the most recently discovered vertex at the top. During the post-order processing of a vertex u (after all its children have been visited), if \low(u) = \disc(u), then u is the root of an SCC, and all vertices from the top of the stack down to and including u are popped to form that component. This popping rule identifies the SCC because no vertex in the popped set can reach an ancestor of u (as indicated by \low(u) not being smaller than \disc(u)), and all are mutually reachable via the path and any cycles within. Back edges play a crucial role in updating low-link values to detect cycles spanning multiple branches. When a back edge from u to an ancestor w (where w is already on the stack and \disc(w) < \disc(u)) is encountered, \low(u) is immediately updated to \min(\low(u), \disc(w)). This adjustment propagates through parent updates, ensuring that low-link values in ancestors reflect the cycle's existence, which may cause earlier vertices to be included in the same SCC during popping. Without this handling, the algorithm would fail to merge components connected via such edges.

Discovery and finishing times

In Tarjan's algorithm for finding strongly connected components (SCCs), discovery times are assigned to vertices during the (DFS) traversal to track the order of visitation. For each u, the discovery time \mathrm{disc} is set to a global that is incremented each time a new is first visited, ensuring that \mathrm{disc} uniquely identifies the step at which u enters the DFS tree. This begins at 0 and increases monotonically, providing a numbering that reflects the traversal of the . Finishing times in the algorithm are handled implicitly through the post-order phase of DFS, where the processing of a vertex u concludes after all its adjacent vertices have been explored via recursive calls. At this finishing point—immediately after recursing on children and updating values from back edges—the algorithm evaluates whether \mathrm{low} = \mathrm{disc}, where \mathrm{low} is the smallest discovery time reachable from u or its descendants in the DFS tree, including via back edges. If equality holds, it indicates that u is the root of an SCC, as no path exists from the subtree rooted at u to an with an earlier discovery time; the algorithm then pops vertices from the path stack until u is reached, forming the SCC. This check leverages the property that \mathrm{low} \leq \mathrm{disc} always, with equality signaling the boundary of the component. To handle graphs with multiple SCCs that may require separate DFS trees, the algorithm iterates over all vertices, initiating a new DFS from any unvisited vertex and assigning its discovery time upon entry. Each such forest traversal processes components in a bottom-up manner relative to the condensation graph, ensuring all SCCs are identified without revisiting vertices, as discovery times mark visited nodes. This mechanism integrates the timestamps seamlessly with the stack for path tracking, enabling efficient detection across disconnected or weakly connected structures.

Implementation

High-level procedure

Tarjan's strongly connected components (SCC) algorithm identifies the SCCs of a through a modified (DFS) that tracks discovery times and low-link values while maintaining a to group vertices into components. The procedure begins with initialization of data structures and iterates over unvisited vertices to initiate DFS traversals, ensuring coverage of disconnected components by multiple calls if necessary. During DFS, each is pushed onto the upon discovery, and low-link values are updated based on to neighbors and back edges to vertices already on the , where a back edge from current u to neighbor v (with v on the ) updates \mathrm{low} = \min(\mathrm{low}, \mathrm{disc}). The overall steps are as follows:
  • Initialization: Set a global time counter to 0, initialize an empty , and prepare arrays to store discovery times (\mathrm{disc}), low-link values (\mathrm{low}), and a visited flag for each , all initially unset or false.
  • Iterate over unvisited vertices: For each u not yet visited, invoke the DFS procedure starting at u. This handles graphs with multiple connected components by launching separate DFS traversals as needed.
  • DFS on vertex u: Assign \mathrm{disc} = \mathrm{low} = current time and increment the time counter. Push u onto the and mark u as visited.
  • Process neighbors: For each adjacent v of u:
  • Pop SCC upon completion: After recursing on all neighbors of u, if \mathrm{low} = \mathrm{disc}, then u roots an SCC: repeatedly pop vertices from the until u is removed, collecting them into a list that forms one SCC.
The algorithm outputs the SCCs as lists of vertices, discovered in reverse topological order relative to the condensation graph (the directed acyclic graph formed by contracting each SCC to a single node). Low-link updates, which propagate the smallest reachable discovery time through the DFS tree and back edges, briefly guide the identification of component roots without altering the core flow.

Detailed pseudocode

The detailed pseudocode for Tarjan's strongly connected components algorithm is presented below, following the original formulation but using modern notation for clarity. The algorithm employs a (DFS) traversal augmented with times (disc), low-link values (low), a to track the current , and a to indicate stack membership (onStack). A global timestamp (time) tracks order. The main procedure initializes structures and iterates over all vertices to initiate DFS calls on undiscovered ones. The recursive SCC subroutine processes each vertex, updates low values based on neighbors, and identifies SCC roots when low equals disc, at which point it pops the to form an SCC. This implementation assumes a directed graph represented as an adjacency list, with vertices labeled from 0 to n-1. Arrays disc, low, and onStack are initialized to -1 (or false for onStack), the stack starts empty, and time is set to 0. The algorithm outputs a list of SCCs, each as a set of vertices.
pseudocode
// Global variables
disc = array of size n, initialized to -1
low = array of size n, initialized to -1
onStack = array of size n, initialized to false
stack = empty stack
time = 0
scc_list = empty list of components

// Main procedure
procedure TarjanSCC([graph](/page/Graph)):
    for each [vertex](/page/Vertex) u in 0 to n-1:
        if disc[u] == -1:
            SCC(u)
    return scc_list

// Recursive DFS subroutine
procedure SCC(u):
    disc[u] = low[u] = time
    time = time + 1
    [stack](/page/Stack).push(u)
    onStack[u] = true
    
    for each neighbor v of u:
        if disc[v] == -1:  // v undiscovered (tree edge)
            SCC(v)
            low[u] = min(low[u], low[v])
        elif onStack[v]:   // v on stack (back edge within current path)
            low[u] = min(low[u], disc[v])
    
    if low[u] == disc[u]:  // u is root of an SCC
        component = empty [list](/page/List)
        repeat:
            v = [stack](/page/Stack).pop()
            onStack[v] = false
            component.append(v)
        until v == u
        scc_list.append(component)
The invariant ensures that popped vertices form a valid SCC, as low values propagate the smallest reachable time within the component. For edge cases, the algorithm handles self-loops naturally: a self-loop from u to u updates low with min(low, ), which has no effect since equals low at that point, and u remains its own SCC if isolated. In single-vertex graphs, the assigns and low, pushes u onto the , and immediately pops it as an SCC since low equals with no neighbors.

Analysis

Time and space complexity

Tarjan's strongly connected components algorithm achieves a time complexity of O(V + E), where V is the number of vertices and E is the number of edges in the directed graph. This efficiency arises from performing a single depth-first search (DFS) traversal, during which each vertex is visited exactly once and each edge is examined exactly once. All operations, including updates to discovery times, low-link values, and stack manipulations, take constant time per vertex or edge. The linear time bound follows from the structure of the DFS-based traversal, which ensures no is revisited after its discovery due to checks against previously visited nodes. Specifically, processes the in a single pass, with the total work proportional to the input size: O(V) for initializing and visiting vertices, plus O(E) for traversing edges and performing constant-time updates for each. This makes optimal in the comparison-based model, as determining strong connectivity requires examining all edges in the worst case to verify . The space complexity is O(V + E), for the of the adjacency lists, auxiliary arrays for discovery times, low-link values, and stack membership (each of size O(V)), as well as the and , which in the worst case hold up to O(V) elements. Excluding the input representation, the additional space required by the algorithm is O(V), dominated by these arrays and the used to track the current during DFS.

Correctness proof outline

The correctness of Tarjan's strongly connected components algorithm is established through a series of invariants and lemmas that ensure the identification of all maximal strongly connected subgraphs during a single depth-first search traversal. A key invariant maintains that the stack at any point contains precisely the vertices on the current path from the root of the DFS tree to the active vertex, comprising all unfinished vertices reachable via tree edges from the root. Another crucial lemma states that the low-link value low for a vertex u accurately captures the smallest discovery time among all vertices reachable from the subtree rooted at u, including via back edges to ancestors on the stack. The core of the proof hinges on the condition low = disc upon finishing the exploration of u's subtree. This equality implies no path exists from the subtree to any discovered before u, as any such back edge would have updated low to a smaller value. Thus, the vertices popped from the down to u form a , since they are interconnected via the tree path and any internal cycles or cross edges within the subtree, with no escape to earlier ancestors. Furthermore, all vertices v in this component satisfy low ≥ disc, confirming the component's maximality and isolation from prior parts of the . For completeness, the algorithm ensures every cycle is detected through back edges that propagate low values upward, linking vertices in the same component. In disconnected graphs, iterative DFS calls from unvisited vertices cover all parts, guaranteeing no strongly connected component is missed. The full proof employs induction over the DFS forest structure, verifying that all components are output exactly once without overlap.

Extensions and Remarks

Applications in graph theory

Tarjan's strongly connected components algorithm facilitates decomposition by identifying SCCs, which can be contracted into single nodes to form a condensation graph—a (DAG)—enabling efficient for resolving dependencies in complex directed graphs. This is particularly useful in scenarios requiring acyclic ordering, such as scheduling tasks with interdependencies, where the linear-time performance of Tarjan's algorithm ensures for large . In compiler design, the algorithm analyzes graphs to detect and irreducible structures, aiding optimizations like identification and code simplification. For instance, Tarjan's method processes the graph to collapse strongly connected regions representing cyclic control paths, allowing subsequent passes to apply transformations such as fission or parallelization. Similarly, in systems and management, it detects circular dependencies among modules or code components by finding SCCs in graphs, preventing build failures and enabling topological ordering for sequences. The algorithm supports network analysis by identifying clusters in directed graphs, such as s or web graphs, where SCCs represent tightly knit communities with mutual among nodes. In social network studies, applying Tarjan's algorithm reveals stable groups of users or pages with reciprocal interactions, facilitating community detection and influence analysis without exhaustive pairwise checks. Modern implementations integrate Tarjan's algorithm into graph libraries like JGraphT, where the StrongConnectivityInspector class employs it to compute SCCs efficiently in Java-based applications. In blockchain systems, post-2010 extensions use it for transaction cycle detection, such as identifying wash trading patterns in NFT markets by finding SCCs in transaction graphs to flag collusive loops. These applications leverage the algorithm's linear-time complexity to handle dynamic, large-scale graphs in real-time consensus protocols.

Comparisons with other algorithms

Tarjan's strongly connected components (SCC) algorithm is frequently contrasted with , another foundational linear-time method for identifying SCCs in directed s. Both algorithms run in O(V + E) time, where V is the number of vertices and E the number of edges, but Kosaraju's requires two (DFS) passes: the first on the original graph to obtain a based on finishing times, and the second on the graph's transpose to extract the components. Tarjan's, by comparison, employs a single DFS traversal augmented with a and low-link values to discover and output components incrementally during the search. In practice, Tarjan's single-pass design yields lower constant factors and superior performance, particularly on large or dense s, as it avoids the overhead of transposing the and a second traversal. Kosaraju's two-pass structure, however, is conceptually simpler and easier to implement, often making it more accessible for introductory purposes or scenarios where code clarity outweighs marginal runtime gains. Experimental evaluations confirm Tarjan's edge in serial execution, with implementations showing consistent speedups over Kosaraju's on diverse datasets. Algorithms relying on multiple path-finding traversals, such as variants of Kosaraju's, can facilitate parallelization by distributing passes across processors, which is advantageous in distributed or multi-core environments. Tarjan's recursive DFS dependency, however, poses challenges for parallelism, limiting its in such settings despite its sequential efficiency on dense graphs where traversals dominate. Tarjan also developed a related algorithm for finding biconnected components in undirected graphs, presented alongside the SCC method in his seminal work. Both leverage DFS with low-link values to detect articulation points and components, but the SCC variant handles directed s to ensure mutual , whereas the biconnected approach focuses on in undirected structures, identifying subgraphs resilient to single- removal. The shared low-link mechanism underscores Tarjan's unified DFS framework, though adaptations for directionality distinguish the two. Selection between these algorithms depends on context: Tarjan's SCC method excels in space-constrained or single-pass scenarios requiring optimal sequential performance, while Kosaraju's suits simpler implementations or parallel-friendly designs; the biconnected variant is preferred for undirected analysis emphasizing robustness over directed cycles.

References

  1. [1]
    Depth-First Search and Linear Graph Algorithms | SIAM Journal on ...
    Depth-First Search and Linear Graph Algorithms. Author: Robert TarjanAuthors ... 4. J. Hopcroft, R. Tarjan, Efficient algorithms for graph manipulation, Tech.
  2. [2]
    [PDF] Finding Strong Components Using Depth-First Search - arXiv
    Apr 11, 2022 · In 1972 the first author [Tar72] presented linear-time algorithms that use depth-first search to solve two fundamental graph problems.
  3. [3]
    [PDF] 451: Strongly Connected Components - Carnegie Mellon University
    Sep 24, 2020 · Tarjan's algorithm is arguably the most clever and elegant: it just adds a few numerical labels to an ordinary depth-first-search and magically ...
  4. [4]
    [PDF] Formal Proofs of Tarjan's Strongly Connected Components ...
    Tarjan's algorithm computes strongly connected components in a directed graph. This paper presents formal proofs of its correctness in Why3, Coq, and Isabelle.
  5. [5]
    [PDF] Strongly Connected Components
    In a directed graph G=(V,E), two nodes u and v are strongly connected if and only if there is a path from u to v and a path from v to u.
  6. [6]
    ICS 311 #14: Graphs - University of Hawaii System
    Oct 25, 2020 · The strongly connected components are the subgraphs defined as above. ... Graph or Network analysis is of considerable importance in ...
  7. [7]
    [PDF] CS 4120 Lecture 29 Interprocedural analysis, iterative fixed-point ...
    For dataflow analysis, this dependency graph is essentially the same as the control flow graph. ... Strongly connected components can be found in linear ...
  8. [8]
    Algorithm 447: efficient algorithms for graph manipulation
    Efficient algorithms are presented for partitioning a graph into connected components, biconnected components and simple paths.
  9. [9]
    [PDF] Formal proofs of two algorithms for strongly connected ... - Hal-Inria
    Dec 24, 2016 · Abstract. We present formal proofs for the two classical Tarjan-1972 and Kosaraju-1978 algorithms for finding strongly connected components.Missing: primary source
  10. [10]
    Nevanlinna Prize 1982 - Robert Tarjan's Pioneering Contributions
    Discover Robert Tarjan, the first Nevanlinna Prize winner in 1982 for outstanding work in mathematical aspects of information science.
  11. [11]
    strongly_connected_components — NetworkX 3.5 documentation
    Uses Tarjan's algorithm[R827335e01166-1]_ with Nuutila's modifications[R827335e01166-2]_. Nonrecursive version of algorithm. References. [1]. Depth-first search ...
  12. [12]
    [PDF] Strongly Connected Components - CS 161
    A strongly connected component in a directed graph G = (V,E) is a maximal set of vertices S ⊂ V such that each vertex v ∈ S has a path to each other vertex u ∈ ...
  13. [13]
    Strongly Connected Components and Condensation Graph
    Oct 22, 2024 · The described algorithm was independently suggested by Kosaraju and Sharir around 1980. It is based on two series of depth first search, with a ...Definitions · Description of the algorithm · Implementation
  14. [14]
    Depth-First Search and Linear Graph Algorithms
    TARJAN, Isomorphism ofplanar graphs, IBM Symposium on Complexity of. Computer Computations, Yorktown Heights, N.Y., March, 1972, to be published by Plenum.
  15. [15]
    [PDF] Strongly Connected Components (Tarjan's Algorithm) - Activities
    Oct 16, 2015 · This section covers Tarjan's algorithm detects strongly connected components in a directed graph. We begin with the DFS traversal of the ...
  16. [16]
    [PDF] Lecture 1: Algorithms for Strongly Connected Components
    Feb 2, 2021 · In a SCC, there is a path from every node x to every node y. A SCC is a maximal subgraph with this property. Equivalent: ∀x,y, path x y.
  17. [17]
    [PDF] Identifying Strongly Connected Components on Distributed Networks
    Tarjan's [8] implementation is the well-known se- quential algorithm for detecting SCC. Both approaches use DFS (Depth First Search), and the complexity is O(V ...<|control11|><|separator|>
  18. [18]
    [PDF] State Space Models over Directed Graphs - arXiv
    Sep 17, 2025 · Next, a condensation graph is constructed, and a topological sort is performed on it, which also takes O(n + m) time. Therefore, the total.
  19. [19]
    Fast condensation of the program dependence graph
    Aggressive compiler optimizations are formulated around the Program Dependence Graph (PDG). Many techniques, including loop fission and parallelization are ...
  20. [20]
    Efficient trimming for strongly connected components calculation
    May 17, 2022 · Strongly Connected Components (SCCs) are useful for many applications, such as community detection and personalized recommendation.Abstract · Information & Contributors · Published In
  21. [21]
    [PDF] Identifying Stable Clusters in Social Networks with Uni - arXiv
    Mar 25, 2012 · In this paper, we propose and develop a stable social cluster detection algorithm that takes into account the tendencies of node pairs whether ...
  22. [22]
    [PDF] Asymmetric Verification for BFT via Incremental Graphs - arXiv
    Oct 16, 2025 · The internal ordering of transactions within an SCC is resolved using a deterministic algorithm, such as finding a Hamiltonian cycle. (4) ...
  23. [23]
    [PDF] The Dark Side of NFTs: A Large-Scale Empirical Study of Wash ...
    Wash trading typically refers to a transaction involv- ing the same person or two colluding individuals, and has become a major threat to the NFT ecosystem.
  24. [24]
    A Comparative Study of Algorithm for Computing Strongly Connected Components
    ### Summary of Tarjan's vs. Kosaraju's Algorithm for SCC
  25. [25]
    [PDF] BFS and Coloring-Based Parallel Algorithms for Strongly Connected ...
    Tarjan's algorithm uses a recursive depth first search (DFS) to form a search tree of explored vertices. The roots of the subtrees of the search tree form roots ...