Advertisement
Guest User

Untitled

a guest
Oct 24th, 2016
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.02 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4.  
  5. using namespace std;
  6.  
  7. #define MAXN 100005
  8. #define D(x) cout << #x << " " << x << endl
  9.  
  10. vector<int> topoSort;
  11. vector<int> g[MAXN], gr[MAXN];
  12. int scc[MAXN], ne[MAXN];
  13. bool state[MAXN];
  14.  
  15. void dfs(int u) {
  16.   state[u] = true;
  17.   for(int i = 0; i < g[u].size(); ++i) {
  18.     int next = g[u][i];
  19.     if(!state[next]) dfs(next);
  20.   }
  21.   topoSort.push_back(u);
  22. }
  23.  
  24. void topologicalSort(int n) {
  25.   for(int i = 0; i <= n; ++i) state[i] = false;
  26.   for(int i = 0; i < n; ++i) if(!state[i]) dfs(i);
  27.   reverse(topoSort.begin(), topoSort.end());
  28. }
  29.  
  30. void dfs2(int u, int currComp) {
  31.   //printf("Node: %d with comp: %d\n", u, currComp);
  32.   scc[u] = currComp;
  33.   for(int i = 0; i < gr[u].size(); ++i) {
  34.     int next = gr[u][i];
  35.     if(scc[next] == -1) dfs2(next, currComp);
  36.   }
  37. }
  38.  
  39. int kosaraju(int n) {
  40.   for(int i = 0; i <= n; ++i) scc[i] = -1;
  41.   topologicalSort(n);
  42.   int currComp = 0;
  43.   for(int i = 0; i < topoSort.size(); ++i) {
  44.     int currNode = topoSort[i];
  45.     if(scc[currNode] == -1) {
  46.       dfs2(topoSort[i], currComp);
  47.       currComp++;
  48.     }
  49.   }
  50.   return currComp;
  51. }
  52.  
  53. void clean(int n) {
  54.   for(int i = 0; i <= n; ++i) {
  55.     g[i].clear();
  56.     gr[i].clear();
  57.   }
  58.   topoSort.clear();
  59. }
  60.  
  61. int main() {
  62.   int t;
  63.   cin >> t;
  64.   while(t--) {
  65.     int n, m;
  66.     cin >> n >> m;
  67.     clean(n);
  68.     for(int i = 0; i < m; ++i) {
  69.       int x, y;
  70.       cin >> x >> y;
  71.       x--; y--;
  72.       //printf("Conn %d to %d\n", x, y);
  73.       g[x].push_back(y);
  74.       gr[y].push_back(x);
  75.     }
  76.     int nComp = kosaraju(n);
  77.     //D(nComp);
  78.     for(int i = 0; i <= nComp; ++i) ne[i] = 0;
  79.     //for(int i = 0; i < n; ++i) printf("Node: %d with SCC: %d\n", i, scc[i]);
  80.     for(int i = 0; i < n; ++i) {
  81.       for(int j = 0; j < g[i].size(); ++j) {
  82.         int currNode = g[i][j];
  83.         if(scc[i] != scc[currNode]) ne[scc[currNode]]++;
  84.       }
  85.     }
  86.     int ans = 0;
  87.     for(int i = 0; i < nComp; ++i) {
  88.       if(!ne[i]) ans++;
  89.     }
  90.     cout << ans << endl;
  91.   }
  92. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement