Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // { Driver Code Starts
- #include<bits/stdc++.h>
- using namespace std;
- // } Driver Code Ends
- class Solution
- {
- private:
- vector<bool> visited;
- stack<int> st;
- void dfs(int u, vector<int> adj[])
- {
- visited[u] = 1;
- for (auto v : adj[u])
- {
- if (!visited[v])
- {
- dfs(v, adj);
- }
- }
- st.push(u);
- }
- void dfs2(int u, vector<int> adj[]){
- visited[u]=1;
- for(auto v:adj[u]){
- if(!visited[v]){
- dfs2(v, adj);
- }
- }
- }
- // vector<vector<int>> reverseGraph(vector<int> adj[], int n)
- // {
- // vector<vector<int>> rev(n);
- // for (int i = 0; i < n; i++)
- // {
- // for (auto v : adj[i])
- // {
- // rev[v].push_back(i);
- // }
- // }
- // return rev;
- // }
- public:
- //Function to find number of strongly connected components in the graph.
- int kosaraju(int V, vector<int> adj[])
- {
- //code here
- int n = V, ans = 0;
- visited.assign(n, false);
- for (int i = 0; i < n; i++)
- {
- if (!visited[i])
- {
- dfs(i, adj);
- }
- }
- visited.assign(n, false);
- // auto revAdj = reverseGraph(adj, n);
- vector<int> revAdj[n];
- for(int i=0;i<n;i++){
- for(auto v: adj[i]){
- revAdj[v].push_back(i);
- }
- }
- while(!st.empty()){
- int s = st.top();
- st.pop();
- if(!visited[s]){
- ans++;
- for(auto v: revAdj[s]){
- if(!visited[v]){
- dfs2(v, revAdj);
- }
- }
- }
- }
- return ans;
- }
- };
- // { Driver Code Starts.
- int main()
- {
- int t;
- cin >> t;
- while(t--)
- {
- int V, E;
- cin >> V >> E;
- vector<int> adj[V];
- for(int i = 0; i < E; i++)
- {
- int u, v;
- cin >> u >> v;
- adj[u].push_back(v);
- }
- Solution obj;
- cout << obj.kosaraju(V, adj) << "\n";
- }
- return 0;
- }
- // } Driver Code Ends
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement