BotByte

SCC.cpp

Mar 12th, 2017
139
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.17 KB | None | 0 0
  1. /* Strongly Connected Components */
  2. /* Author : M. A. Rafsan Mazumder */
  3.  
  4. #include <bits/stdc++.h>
  5.  
  6. using namespace std;
  7.  
  8. #define MAX 10005
  9. vector<int> adj[MAX];
  10. vector<int> revAdj[MAX];
  11. bool vis[MAX];
  12. stack<int> S;
  13.  
  14. void stackEmpty()
  15. {
  16.     while(!S.empty()){
  17.         S.pop();
  18.     }
  19. }
  20.  
  21. void dfs(int u)
  22. {
  23.     vis[u] = true;
  24.     for(int i=0; i<adj[u].size(); i++){
  25.         int v = adj[u][i];
  26.         if(!vis[v]) dfs(v);
  27.     }
  28.     S.push(u);
  29. }
  30.  
  31. void dfs2(int u)
  32. {
  33.     vis[u] = true;
  34.     for(int i=0; i<revAdj[u].size(); i++){
  35.         int v = revAdj[u][i];
  36.         if(!vis[v]) dfs2(v);
  37.     }
  38. }
  39.  
  40. int main()
  41. {
  42.     stackEmpty();
  43.     int n, m;
  44.     scanf("%d %d", &n, &m);
  45.     for(int i=1; i<=m; i++){
  46.         int u, v;
  47.         scanf("%d %d", &u, &v);
  48.         adj[u].push_back(v);
  49.         revAdj[v].push_back(u);
  50.     }
  51.     memset(vis, false, sizeof vis);
  52.     for(int i=1; i<=n; i++){
  53.         if(!vis[i]) dfs(i);
  54.     }
  55.     memset(vis, false, sizeof vis);
  56.     int cnt = 0;
  57.     while(!S.empty()){
  58.         int t = S.top();
  59.         S.pop();
  60.         if(!vis[t]){
  61.             cnt++;
  62.             dfs2(t);
  63.         }
  64.     }
  65.     printf("%d", cnt);
  66. }
Advertisement
Add Comment
Please, Sign In to add comment