Maruf_Hasan

Strongly Connected Component_KosarajuAlgo

May 16th, 2020
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.51 KB | None | 0 0
  1.  
  2. //In the Name of Allah Most Gracious, Most Merciful//
  3. /*If you want something you've never had, you have to do something you never did.*/
  4.  
  5. #include<bits/stdc++.h>
  6. using namespace std;
  7.  
  8.  
  9. #define pb push_back
  10. #define ll unsigned long long
  11. #define pii pair<int,int>
  12. #define pll pair<ll,ll>
  13. #define M 1000007
  14. #define INFL 1e18
  15. #define PI acos(-1)
  16. #define mp make_pair
  17. #define fast_in_out ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
  18. //const int fx[]= {+1,-1,+0,+0};
  19. //const int fy[]= {+0,+0,+1,-1};
  20. //const int fx[]={+0,+0,+1,-1,-1,+1,-1,+1}; // Kings Move
  21. //const int fy[]={-1,+1,+0,+0,+1,+1,-1,-1}; // Kings Move
  22. //const int fx[]={-2, -2, -1, -1, 1, 1, 2, 2}; // Knights Move
  23. //const int fy[]={-1, 1, -2, 2, -2, 2, -1, 1}; // Knights Move
  24. bool visited[M];
  25. int finish_time[M];
  26. vector<int>adj[M],revAdj[M];
  27. vector<int>scc[M];
  28. int cost[M];
  29. vector<pii>v;
  30. vector<int>vv;
  31. int t=0;
  32. int MOD=1e9+7;
  33.  
  34. void dfs1(int src)
  35. {
  36. visited[src]=true;
  37. for(int i=0;i<adj[src].size();i++)
  38. {
  39. int k=adj[src][i];
  40. if(visited[k]==false)
  41. {
  42. dfs1(k);
  43. }
  44. }
  45. finish_time[src]=++t;
  46. }
  47.  
  48. void dfs2(int src,int p)
  49. {
  50. visited[src]=true;
  51. // cout<<src<<" "<<p<<endl;
  52. scc[p].pb(src);
  53. for(int i=0;i<revAdj[src].size();i++)
  54. {
  55. int k=revAdj[src][i];
  56. if(visited[k]==false)
  57. {
  58. dfs2(k,p);
  59. }
  60. }
  61. }
  62.  
  63.  
  64. int main()
  65. {
  66. fast_in_out;
  67. //freopen("input.txt","r",stdin);
  68. //freopen("output.txt","w",stdout);
  69. int n;
  70. cin>>n;
  71. for(int i=1;i<=n;i++)
  72. {
  73. cin>>cost[i];
  74. }
  75. int m;
  76. cin>>m;
  77. for(int i=0;i<m;i++)
  78. {
  79. int x,y;
  80. cin>>x>>y;
  81. adj[x].pb(y);
  82. revAdj[y].pb(x);
  83. }
  84. memset(visited,false,sizeof visited);
  85. for(int i=1;i<=n;i++)
  86. {
  87. if(visited[i]==false)
  88. {
  89. dfs1(i);
  90. }
  91. }
  92. for(int i=1;i<=n;i++)
  93. {
  94. v.pb(mp(finish_time[i],i));
  95. }
  96. sort(v.begin(),v.end());
  97. int num=1;
  98. memset(visited,false,sizeof visited);
  99. ll sum=0;
  100. ll total=1;
  101. for(int i=v.size()-1;i>=0;i--)
  102. {
  103. int k=v[i].second;
  104. if(visited[k]==false)
  105. {
  106. dfs2(k,num);
  107. num++;
  108. }
  109. }
  110. // for(int i=1;i<num;i++)
  111. // {
  112. // for(int j=0;j<scc[i].size();j++)
  113. // {
  114. // cout<<i<<" "<<scc[i][j]<<endl;
  115. // }
  116. // }
  117. int total_scc=num-1;
  118. cout<<total_scc<<endl;
  119.  
  120. }
Advertisement
Add Comment
Please, Sign In to add comment