Skip to main content

Kosaraju’s Algorithm

Problem Statement:​

  • Example:


✅ Solution: Kosaraju’s Algorithm (Strongly Connected Components)​

// User function Template for C++

class Solution {
public:
void dfs(int node, vector<int> adj[], vector<bool> &vis, stack<int> &st){
vis[node] = true;
for(auto neigh : adj[node]){
if(!vis[neigh]){
dfs(neigh, adj, vis, st);
}
}
st.push(node); // finish time
}

void revDfs(int node, vector<int> revAdj[], vector<bool> &vis){
vis[node] = true;
for(auto neigh : revAdj[node]){
if(!vis[neigh]){
revDfs(neigh, revAdj, vis);
}
}
}

int kosaraju(int V, vector<int> adj[]) {
// Step 1: Do DFS and store finish times
stack<int> st;
vector<bool> vis(V, false);
for(int i = 0; i < V; i++){
if(!vis[i]){
dfs(i, adj, vis, st);
}
}

// Step 2: Reverse the graph
vector<int> revAdj[V];
for(int u = 0; u < V; u++){
for(auto v : adj[u]){
revAdj[v].push_back(u); // reverse edge
}
}

// Step 3: Do DFS in order of decreasing finish time on reversed graph
fill(vis.begin(), vis.end(), false);
int sccCount = 0;
while(!st.empty()){
int node = st.top(); st.pop();
if(!vis[node]){
revDfs(node, revAdj, vis);
sccCount++; // each DFS marks one strongly connected component
}
}

return sccCount;
}
};


📝 How It Works​

Kosaraju's algorithm is used to find the number of strongly connected components (SCCs) in a directed graph.

The process has 3 major steps:

  1. First DFS:
    • Perform DFS and store vertices in a stack according to finish time (postorder).
  2. Transpose Graph:
    • Reverse the direction of all edges.
  3. Second DFS on Transposed Graph:
    • Pop nodes from the stack and do DFS on the reversed graph.
    • Each DFS traversal will give one SCC.

🧩 Key Observations​

  • Vertices belonging to the same SCC will always finish together in DFS.
  • Reversing the graph ensures we only visit nodes within the same SCC during the second DFS.

⏱️ Time & Space Complexity​

MetricValue
⏱️ TimeO(V + E)
💾 SpaceO(V + E)

⚠️ Edge Cases​

  • Empty graph → 0 SCCs
  • Disconnected graph → SCCs equal to number of nodes
  • All nodes in a cycle → only 1 SCC

💡 Other Approaches​

ApproachTimeNotes
Tarjan’s AlgorithmO(V + E)One-pass DFS using low-link values
Kosaraju ✅O(V + E)Easier to implement with two DFS passes

  • Leetcode 2115: Find All Recipes You Can Make (uses topological + SCC concepts)
  • GFG: Strongly Connected Components (Kosaraju)
  • Tarjan’s SCC algorithm
  • Condensation of a Graph (DAG of SCCs)

🚀 Level Up Your Engineering Mindset

Never Study in Isolation. Join Binary Dose.

Connect with fellow engineers, clear conceptual doubts, and get 2 visual breakdowns & engineering mental models daily across our community channels.

Discord
Official Hub

Discord Community

Start at #welcome-and-rules, say hello in #general-chat, clear doubts, and collaborate with engineers worldwide.

Join Discord Server→
⚡
Daily Knowledge Drops

Daily Visual Deep-Dives

Bite-sized system design schematics, core OS internals, and DSA intuition served right into your feeds every single day.

💡Have handwritten notes, cheat-sheets, or want to publish a technical article?
Learn How to Contribute→