diff --git a/CPP/graph_tree/Kosaraju_Algorithm.cpp b/CPP/graph_tree/Kosaraju_Algorithm.cpp new file mode 100644 index 00000000..eb28b656 --- /dev/null +++ b/CPP/graph_tree/Kosaraju_Algorithm.cpp @@ -0,0 +1,77 @@ +#include +using namespace std; +void dfs(int node, stack &st, vector &vis, vector adj[]) { + vis[node] = 1; + for(auto it: adj[node]) { + if(!vis[it]) { + dfs(it, st, vis, adj); + } + } + + st.push(node); +} +void revDfs(int node, vector &vis, vector transpose[]) { + cout << node << " "; + vis[node] = 1; + for(auto it: transpose[node]) { + if(!vis[it]) { + revDfs(it, vis, transpose); + } + } +} +int main() { + int n=6, m=7; + vector adj[n+1]; + adj[1].push_back(3); + adj[2].push_back(1); + adj[3].push_back(2); + adj[3].push_back(5); + adj[4].push_back(6); + adj[5].push_back(4); + adj[6].push_back(5); + + stack st; + vector vis(n+1, 0); + for(int i = 1;i<=n;i++) { + if(!vis[i]) { + dfs(i, st, vis, adj); + } + } + + vector transpose[n+1]; + + for(int i = 1;i<=n;i++) { + vis[i] = 0; + for(auto it: adj[i]) { + transpose[it].push_back(i); + } + } + + + + while(!st.empty()) { + int node = st.top(); + st.pop(); + if(!vis[node]) { + cout << "SCC: "; + revDfs(node, vis, transpose); + cout << endl; + } + } + + + return 0; +} + +/* +Output: + +SCC: 1 2 3 +SCC: 5 6 4 + +Time Complexity: O(N+E), DFS+TopoSort + +Space Complexity: O(N+E), Transposing the graph +*/ + +//contributed by Sourav Naskar \ No newline at end of file