Back to challenges
Hard 0 solved 0% acceptance

Strongly Connected Components

Count groups of nodes that can all reach each other.

What you'll learn

  • Find groups of mutually reachable nodes
  • Use DFS finishing order or low-link values
  • Work with directed graphs

Problem

In a directed graph with nodes 0..n−1, a strongly connected component is a maximal group of nodes where every node can reach every other. Count the components (Kosaraju's or Tarjan's algorithm).

Implement count_scc(n, edges).

Input

n: The number of nodes. edges: Directed edges as [from, to].

Output

Return the number of components.

Constraints

1 ≤ n ≤ 100,000; 0 ≤ edges ≤ 200,000

Examples

Example 1
Input:
n = 5
edges = [
    [0, 1],
    [1, 2],
    [2, 0],
    [3, 4]
]

Expected output:
expected = 3
Input:
long long n = 5;
std::vector<std::vector<long long>> edges = {
    {0, 1},
    {1, 2},
    {2, 0},
    {3, 4}
};

Expected output:
long long expected = 3;
Input:
long n = 5;
long[][] edges = new long[][] {
    new long[] {0, 1},
    new long[] {1, 2},
    new long[] {2, 0},
    new long[] {3, 4}
};

Expected output:
long expected = 3;

Explanation

0, 1, 2 form a cycle (one component); 3 and 4 can't reach each other, so they are separate: 3.

Example 2
Input:
n = 3
edges = [
    [0, 1],
    [1, 0],
    [1, 2],
    [2, 1]
]

Expected output:
expected = 1
Input:
long long n = 3;
std::vector<std::vector<long long>> edges = {
    {0, 1},
    {1, 0},
    {1, 2},
    {2, 1}
};

Expected output:
long long expected = 1;
Input:
long n = 3;
long[][] edges = new long[][] {
    new long[] {0, 1},
    new long[] {1, 0},
    new long[] {1, 2},
    new long[] {2, 1}
};

Expected output:
long expected = 1;

Explanation

All three nodes reach each other: 1.

How to approach it

Try on your own first, then open one hint at a time.

Hint 1

A node belongs with another only if each can reach the other, so think in terms of mutually reachable regions rather than simple reachability.

Hint 2

Use a graph traversal order on the original graph, then explore the reversed graph to collect one region at a time.

Hint 3

Watch for finishing order and isolated nodes; every node must be assigned exactly once, even if it has no incoming or outgoing edges.

Expected complexity

O(n + m) time, O(n + m) extra space

References

This challenge is adapted for CodeUtility. Follow the statement and constraints above.

Learn from others

Community solutions

No published solutions yet. Solve this challenge to share the first one.