Advertisement
Gornak40

Конденсация

Mar 24th, 2021
1,146
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.62 KB | None | 0 0
  1. #pragma GCC optimize("O3")
  2. #pragma GCC target("avx2")
  3. #include <bits/stdc++.h>
  4. #include <ext/rope>
  5. #include <ext/pb_ds/assoc_container.hpp>
  6. #define endl '\n'
  7. #define fixstd() ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0)
  8. #define precision(n) cout.setf(ios::fixed), cout.precision(n)
  9. #define all(arr) arr.begin(), arr.end()
  10. #define rall(arr) arr.rbegin(), arr.rend()
  11. #define sz(arr) int(arr.size())
  12. #define sqr(n) ((n) * (n))
  13. #define print(arr) {for (auto el: arr) cout << el << ' '; cline();}
  14. #define pprint(A) for (auto &x: A) print(x)
  15. #define cprint(A) {for (auto &x: A) cout << x.fi << ',' << x.se << ' '; cline();}
  16. #define read(arr) for (auto &el: arr) cin >> el
  17. #define make_uniq(arr) sort(all(arr)), arr.resize(unique(all(arr)) - arr.begin());
  18. #define inc(arr) for (auto &x: arr) ++x
  19. #define dec(arr) for (auto &x: arr) --x
  20. #define jumpout() assert(false)
  21. #define multitest() int _; cin >> _; for (; _; --_)
  22. #define yesno(fl) (fl ? "YES" : "NO")
  23. #define out(n) cout << n << endl, exit(0);
  24. #define write(n) cout << n << endl
  25. #define debug(s, n) cout << s << ": " << n << endl
  26. #define cline() cout << endl
  27. #define pb push_back
  28. #define mp make_pair
  29. #define fi first
  30. #define se second
  31. using namespace std;
  32. using namespace __gnu_cxx;
  33. using namespace __gnu_pbds;
  34. typedef tree<int, null_type, less<int>, rb_tree_tag,
  35. tree_order_statistics_node_update> indexed_set;
  36. typedef long double ld;
  37. typedef string str;
  38. #define int int64_t
  39. typedef pair<int, int> col;
  40. typedef pair<ld, ld> cold;
  41. typedef pair<str, str> cols;
  42.  
  43. int n, m, num_comp;
  44. vector<vector<int>> gr, rgr;
  45. vector<bool> used;
  46. vector<int> tops, comp;
  47. vector<set<int>> cgr;
  48.  
  49. void init() {
  50.     num_comp = 0;
  51.     gr.resize(n);
  52.     rgr.resize(n);
  53.     comp.assign(n, -1);
  54. }
  55.  
  56. void dfs(int v) {
  57.     if (used[v]) return;
  58.     used[v] = true;
  59.     for (int u: gr[v])
  60.         dfs(u);
  61.     tops.pb(v);
  62. }
  63.  
  64. void rdfs(int v) {
  65.     if (used[v]) return;
  66.     used[v] = true;
  67.     comp[v] = num_comp;
  68.     for (int u: rgr[v])
  69.         rdfs(u);
  70. }
  71.  
  72. int solve() {
  73.     used.assign(n, false);
  74.     for (int v = 0; v < n; ++v)
  75.         dfs(v);
  76.     reverse(all(tops));
  77.     used.assign(n, false);
  78.     for (int v: tops) {
  79.         if (used[v]) continue;
  80.         rdfs(v);
  81.         ++num_comp;
  82.     }
  83.     cgr.resize(num_comp);
  84.     for (int v = 0; v < n; ++v) {
  85.         for (int u: gr[v]) {
  86.             int cv = comp[v], cu = comp[u];
  87.             if (cv == cu) continue;
  88.             cgr[cv].insert(cu);
  89.         }
  90.     }
  91.     int ans = 0;
  92.     for (int v = 0; v < num_comp; ++v)
  93.         ans += sz(cgr[v]);
  94.     return ans;
  95. }
  96.  
  97. signed main() {
  98.     fixstd();
  99.     cin >> n >> m, init();
  100.     for (int i = 0; i < m; ++i) {
  101.         int v, u; cin >> v >> u, --v, --u;
  102.         gr[v].pb(u), rgr[u].pb(v);
  103.     }
  104.     int ans = solve();
  105.     write(ans);
  106. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement