function kosarajuSCC(V, adj) {
const visited = new Array(V).fill(false);
const stack = [];
function dfs(v) {
visited[v] = true;
for (let nei of adj[v] || []) {
if (!visited[nei]) dfs(nei);
}
stack.push(v);
}
for (let i = 0; i < V; i++) {
if (!visited[i]) dfs(i);
}
const transpose = Array.from({ length: V }, () => []);
for (let u = 0; u < V; u++) {
for (let v of adj[u] || []) {
transpose[v].push(u);
}
}
visited.fill(false);
let count = 0;
function reverseDFS(v) {
visited[v] = true;
for (let nei of transpose[v]) {
if (!visited[nei]) reverseDFS(nei);
}
}
while (stack.length > 0) {
const node = stack.pop();
if (!visited[node]) {
reverseDFS(node);
count++;
}
}
return count;
}
// Example usage
const graph = {
0: [1],
1: [2],
2: [0],
3: [4]
};
console.log("Number of SCCs:", kosarajuSCC(5, graph)); // Output: 2