Advertisement
Guest User

Untitled

a guest
Dec 19th, 2018
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.66 KB | None | 0 0
  1. //my G3
  2. #include <iostream>
  3. #include <vector>
  4. #include <algorithm>
  5. #include <set>
  6. #include <map>
  7. #include <cmath>
  8. #include <iomanip>
  9. #include <fstream>
  10.  
  11.  
  12. using namespace std;
  13.  
  14. typedef long long ll;
  15. typedef long double ld;
  16.  
  17. typedef pair<ll, ll> Pair;
  18. vector<vector<int>> g;
  19. vector<vector<int>> grev;
  20. vector<bool> been;
  21. vector<int> cond;
  22.  
  23. vector<vector<int>> nw;
  24. void dfsSet(int v) {
  25. if(been[v]) {
  26. return;
  27. }
  28. been[v] = true;
  29. for(int i = 0; i < g[v].size(); i++) {
  30.  
  31. dfsSet(g[v][i]);
  32. }
  33. cond.push_back(v);
  34. }
  35.  
  36. int color = 0;
  37. vector<int> cc;
  38. void dfs(int v) {
  39. if(been[v]) return;
  40. been[v] = true;
  41. cc[v] = color;
  42. for(int i = 0; i < grev[v].size(); i++) {
  43. dfs(grev[v][i]);
  44.  
  45. }
  46. }
  47. set<pair<int, int>> e;
  48. vector<pair<int, int>> ev;
  49. void dfs2(int v) {
  50. if(been[v]) return;
  51. been[v] = true;
  52. for(int i = 0; i < g[v].size(); i++) {
  53. int a = cc[v];
  54. int b = cc[g[v][i]];
  55. if(e.find({a, b}) == e.end()) {
  56. e.insert({a, b});
  57. ev.push_back({a, b});
  58. }
  59. dfs2(g[v][i]);
  60. }
  61. }
  62.  
  63. void dfs3(int v) {
  64. if(been[v]) return;
  65. been[v] = true;
  66. for(int i = 0; i < nw[v].size(); i++) {
  67. dfs3(nw[v][i]);
  68. }
  69. }
  70.  
  71. int main()
  72. {
  73. ios_base::sync_with_stdio(false);
  74. cin.tie(0);
  75. cout.tie(0);
  76. int n, m;
  77. cin >> n >> m;
  78. g.resize(n);
  79. grev.resize(n);
  80. been.resize(n);
  81. for(int i = 0; i < m; i++) {
  82. int a, b;
  83. cin >> a >> b;
  84. g[a].push_back(b);
  85. grev[b].push_back(a);
  86.  
  87. }
  88. for(int i = 0; i < n; i++) {
  89. dfsSet(i);
  90. }
  91. been.assign(n, false);
  92. cc.resize(n);
  93.  
  94. reverse(cond.begin(), cond.end());
  95. for(int i = 0; i < n; i++) {
  96. if(!been[cond[i]]) {
  97. dfs(cond[i]);
  98. color++;
  99. }
  100. }
  101. been.assign(n, false);
  102. for(int i = 0; i < n; i++) {
  103. dfs2(i);
  104. }
  105. int ans = 0;
  106. set<pair<int, int>> ban;
  107. for(int i = 0; i < ev.size(); i++) {
  108. int a = ev[i].first;
  109. int b = ev[i].second;
  110. if(ban.find({a, b}) != ban.end()) continue;
  111. if(e.find({b, a}) == e.end()) {
  112. ans++;
  113. ban.insert({b, a});
  114. }
  115. }
  116. nw.resize(color);
  117. for(int i = 0; i < ev.size(); i++) {
  118. nw[ev[i].first].push_back(ev[i].second);
  119. nw[ev[i].second].push_back(ev[i].first);
  120. }
  121. been.assign(n, false);
  122.  
  123.  
  124. for(int i = 0; i < nw.size(); i++) {
  125. if(!been[i]) {
  126. dfs3(i);
  127. ans+=2;
  128. }
  129. }
  130.  
  131. cout << ans-2 << endl;
  132. return 0;
  133.  
  134. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement