Advertisement
daskalot

Untitled

Jan 18th, 2019
223
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.87 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define pb push_back
  3. #define mp make_pair
  4. #define INF (1 << 27)
  5. #define EPS 0.00000000001
  6. using namespace std;
  7. vector <int> g[1000];
  8. bool visited[1000];
  9. void addEdge(int a,int b){
  10. g[a].push_back(b);
  11. //g[b].pb(a);
  12. }
  13. bool checkLink(int s,int t){
  14. for(int i=0;i<2000;i++) visited[i] = false;
  15. visited[s] = true;
  16. queue<int> q;
  17. q.push(s);
  18. while(!q.empty()){
  19. s = q.front();
  20. q.pop();
  21. for(int i=0;i<g[s].size();i++){
  22. if(g[s][i] == t) return true;
  23. if(!visited[g[s][i]]){
  24. visited[g[s][i]] = true;
  25. q.push(g[s][i]);
  26. }
  27. }
  28. }
  29. return false;
  30. }
  31. bool checkLinkDfs(int s,int t){
  32. for(int i=0;i<2000;i++) visited[i] = false;
  33. visited[s] = true;
  34. stack<int> q;
  35. q.push(s);
  36. while(!q.empty()){
  37. s = q.top();
  38. q.pop();
  39. for(int i=0;i<g[s].size();i++){
  40. if(g[s][i] == t) return true;
  41. if(!visited[g[s][i]]){
  42. visited[g[s][i]] = true;
  43. q.push(g[s][i]);
  44. }
  45. }
  46. }
  47. return false;
  48. }
  49. int N;
  50. stack<int> res;
  51. void topSort(int s) {
  52. visited[s] = true;
  53. for(int i=0;i<g[s].size();i++){
  54. if(!visited[g[s][i]])
  55. topSort(g[s][i]);
  56. }
  57. res.push(s);
  58. }
  59. void topologicalSort(){
  60. for(int i=0;i<N;i++)
  61. if(!visited[i]) topSort(i);
  62.  
  63. }
  64. vector<int> gr[1000];
  65. void printGraph(){
  66. for(int i=0;i<N;i++)
  67. for(int j=0;j<g[i].size();j++){
  68. cout<<g[i][j]<<" ";
  69. cout<<endl;
  70. }
  71. }
  72. void printGraph2(){
  73. for(int i=0;i<N;i++)
  74. for(int j=0;j<gr[i].size();j++){
  75. cout<<gr[i][j]<<" ";
  76. cout<<endl;
  77. }
  78. }
  79. void reverseGraph(){
  80. for(int i=0;i<N;i++)
  81. for(int j=0;j<g[i].size();j++)
  82. gr[g[i][j]].pb(i);
  83.  
  84. }
  85. int maxNodes = 0;
  86. int tempNodes = 0;
  87. void DFS(int s){
  88. visited[s] = true;
  89. tempNodes++;
  90. for(int i=0;i<gr[s].size();i++)
  91. if(!visited[gr[s][i]])
  92. DFS(gr[s][i]);
  93. }
  94. void reset(){
  95. for(int i=0;i<N;i++)
  96. visited[i] = false;
  97. }
  98. int components = 0;
  99. void SCC(){
  100. reset();
  101. topologicalSort();
  102. reverseGraph();
  103. reset();
  104. while(!res.empty()){
  105. res.pop();
  106. int temp = res.top();
  107. if(!visited[temp]){
  108. components++;
  109. DFS(temp);
  110. cout<<temp<<endl;
  111. maxNodes = max(maxNodes,tempNodes);
  112. tempNodes = 0;
  113. }
  114. }
  115. }
  116. int main(){
  117. cin >> N;
  118. int m;
  119. cin >> m;
  120. for(int i=0;i<m;i++){
  121. int a,b;
  122. cin >> a >> b;
  123. //if(!checkLinkDfs(a,b))
  124. addEdge(a,b);
  125. // else cout << a << "," << b << endl;
  126. }
  127. //topologicalSort();
  128. SCC();
  129. cout << components << endl << maxNodes;
  130. return 0;
  131. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement