jw910731

SCC

Feb 28th, 2020
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.41 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #ifdef TEST
  3.     #define debug(...) printf(__VA_ARGS__)
  4. #else
  5.     #define debug(...) (void)0
  6. #endif
  7. #define EB emplace_back
  8. #define MP make_pair
  9. #define ST first
  10. #define ND second
  11. using namespace std;
  12. using ll = long long;
  13. using llu = long long unsigned;
  14. using pii = pair<int,int>;
  15. /************************/
  16. #define MXV 100000
  17. vector<int> grpah[MXV+5];
  18. int V, E, t = 0;
  19. int depth[MXV+5], low[MXV+5], instk[MXV+5];
  20. bool visit[MXV+5], ans[MXV+5];
  21. stack<int> stk;
  22. // v => vertex id, d = current depth
  23. void tarjan(int v){
  24.     stk.emplace(v);
  25.     visit[v] = true;
  26.     instk[v] = true;
  27.     depth[v] = low[v] = ++t;
  28.  
  29.     for(int ch : grpah[v]){
  30.         if(!visit[ch]){
  31.             tarjan(ch);
  32.             low[v] = min(low[v], low[ch]);
  33.         }
  34.         else if (instk[ch]) low[v] = min(low[v], depth[ch]);
  35.     }
  36.     if(depth[v] == low[v]){
  37.         vector<int> targ;
  38.         int x;
  39.         do{
  40.             instk[x = stk.top()] = false;
  41.             targ.EB(x);
  42.             stk.pop();
  43.         }while(x != v);
  44.         if(targ.size() > 1){
  45.             for(int n : targ){
  46.                 ans[n] = true;
  47.             }
  48.         }
  49.     }
  50. }
  51. void init(){
  52.     memset(visit, 0x00, sizeof(visit));
  53.     memset(ans, 0x00, sizeof(ans));
  54. }
  55. int main(){
  56.     init();
  57.     scanf("%d%d", &V, &E);
  58.     for(int i = 0 ; i < E ; ++i){
  59.         int x, y;
  60.         scanf("%d%d", &x, &y);
  61.         grpah[x].EB(y);
  62.     }
  63.     for(int i = 1 ; i <= V ; ++i){
  64.         if(!visit[i]){
  65.             tarjan(i);
  66.         }
  67.     }
  68.     for(int i = 1 ; i <= V ; ++i){
  69.         printf("%d ", ans[i]);
  70.     }
  71.     //printf("\n");
  72.     return 0;
  73. }
Add Comment
Please, Sign In to add comment