Advertisement
Guest User

Untitled

a guest
Dec 17th, 2017
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.30 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define f first
  4. #define s second
  5. #define mp make_pair
  6. #define pb push_back
  7. #define N 40000
  8.  
  9. int n, m, a, b, x, post, vertex[N];
  10. vector <int> v[N],
  11. new_graph[N],
  12. vertices_scc[N],
  13. scc[N];
  14. int st[N], rst, roz, SCC[N], scc_counter;
  15. bool odw[N], odw_scc[N], odw_top[N], CZY[N];
  16.  
  17. int sec(int x)
  18. {
  19. if (x % 2 == 0) return x - 1;
  20. else return x + 1;
  21. }
  22.  
  23. void in()
  24. {
  25. scanf("%d%d", &n, &m);
  26. for (int i = 1; i <= m; i++)
  27. {
  28. scanf("%d%d", &a, &b);
  29. v[a].pb(sec(b));
  30. v[b].pb(sec(a));
  31. }
  32. }
  33.  
  34. void dfs(int x)
  35. {
  36. odw[x] = true;
  37. //printf("X: %d\n", x);
  38.  
  39. for (int i = 0; i < (int) v[x].size(); i++)
  40. {
  41. new_graph[v[x][i]].pb(x);
  42. if (odw[v[x][i]] == false)
  43. dfs(v[x][i]);
  44. }
  45.  
  46. st[rst++] = x;
  47. }
  48.  
  49. void dfs_scc(int x)
  50. {
  51. odw_scc[x] = true;
  52. vertices_scc[scc_counter].pb(x);
  53. SCC[x] = scc_counter;
  54.  
  55. for (int i = 0; i < (int) new_graph[x].size(); i++)
  56. {
  57. if (odw_scc[new_graph[x][i]] == false)
  58. dfs_scc(new_graph[x][i]);
  59. }
  60. }
  61.  
  62. void clear_st()
  63. {
  64. while (rst != -1)
  65. {
  66. rst--;
  67. if (odw_scc[st[rst]] == false && st[rst] != 0)
  68. dfs_scc(st[rst]),
  69. scc_counter++;
  70. }
  71. }
  72.  
  73.  
  74. void make_scc()
  75. {
  76. for (int i = 1; i <= 2 * n; i++)
  77. {
  78. for (int j = 0; j < (int) v[i].size(); j++)
  79. {
  80. if (SCC[i] != SCC[v[i][j]])
  81. scc[SCC[i]].pb(SCC[v[i][j]]);
  82. }
  83. }
  84. }
  85.  
  86. void topological_dfs(int x)
  87. {
  88. odw_top[x] = true;
  89. for (int i = 0; i < (int) scc[x].size(); i++)
  90. {
  91. if (odw_top[scc[x][i]] == false)
  92. topological_dfs(scc[x][i]);
  93. }
  94. post++;
  95. vertex[post] = x;
  96. }
  97.  
  98. void topological_sort()
  99. {
  100. for (int i = 0; i < scc_counter; i++)
  101. if (odw_top[i] == false)
  102. topological_dfs(i);
  103. }
  104.  
  105. void kurwa_dosc()
  106. {
  107. for (int i = 0; i <= scc_counter; i++)
  108. {
  109. if (CZY[i] == 0)
  110. {
  111. for (int j = 0; j < (int) vertices_scc[i].size(); j++)
  112. {
  113. CZY[SCC[sec(vertices_scc[i][j])]] = -1;
  114. }
  115.  
  116. for (int j = 0; j < (int) scc[j].size(); j++)
  117. {
  118. CZY[scc[i][j]] = -1;
  119. }
  120. }
  121. }
  122.  
  123. for (int i = 0; i <= scc_counter; i++)
  124. {
  125. if (CZY[i] == 0)
  126. for (int j = 0; j < (int) vertices_scc[i].size(); j++)
  127. {
  128. printf("%d\n", vertices_scc[i][j]);
  129. }
  130. }
  131. }
  132.  
  133. int main()
  134. {
  135. in();
  136.  
  137. for (int i = 1; i <= 2 * n; i++)
  138. if (odw[i] == false)
  139. dfs(i), clear_st();
  140.  
  141. make_scc();
  142. kurwa_dosc();
  143. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement