Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #pragma GCC optimize("O3")
- #pragma GCC target("avx2")
- #include <bits/stdc++.h>
- #include <ext/rope>
- #include <ext/pb_ds/assoc_container.hpp>
- #define endl '\n'
- #define fixstd() ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0)
- #define precision(n) cout.setf(ios::fixed), cout.precision(n)
- #define all(arr) arr.begin(), arr.end()
- #define rall(arr) arr.rbegin(), arr.rend()
- #define sz(arr) int(arr.size())
- #define sqr(n) ((n) * (n))
- #define print(arr) {for (auto el: arr) cout << el << ' '; cline();}
- #define pprint(A) for (auto &x: A) print(x)
- #define cprint(A) {for (auto &x: A) cout << x.fi << ',' << x.se << ' '; cline();}
- #define read(arr) for (auto &el: arr) cin >> el
- #define make_uniq(arr) sort(all(arr)), arr.resize(unique(all(arr)) - arr.begin());
- #define inc(arr) for (auto &x: arr) ++x
- #define dec(arr) for (auto &x: arr) --x
- #define jumpout() assert(false)
- #define multitest() int _; cin >> _; for (; _; --_)
- #define yesno(fl) (fl ? "YES" : "NO")
- #define out(n) cout << n << endl, exit(0);
- #define write(n) cout << n << endl
- #define debug(s, n) cout << s << ": " << n << endl
- #define cline() cout << endl
- #define pb push_back
- #define mp make_pair
- #define fi first
- #define se second
- using namespace std;
- using namespace __gnu_cxx;
- using namespace __gnu_pbds;
- typedef tree<int, null_type, less<int>, rb_tree_tag,
- tree_order_statistics_node_update> indexed_set;
- typedef long double ld;
- typedef string str;
- #define int int64_t
- typedef pair<int, int> col;
- typedef pair<ld, ld> cold;
- typedef pair<str, str> cols;
- int n, m, num_comp;
- vector<vector<int>> gr, rgr;
- vector<bool> used;
- vector<int> tops, comp;
- vector<set<int>> cgr;
- void init() {
- num_comp = 0;
- gr.resize(n);
- rgr.resize(n);
- comp.assign(n, -1);
- }
- void dfs(int v) {
- if (used[v]) return;
- used[v] = true;
- for (int u: gr[v])
- dfs(u);
- tops.pb(v);
- }
- void rdfs(int v) {
- if (used[v]) return;
- used[v] = true;
- comp[v] = num_comp;
- for (int u: rgr[v])
- rdfs(u);
- }
- int solve() {
- used.assign(n, false);
- for (int v = 0; v < n; ++v)
- dfs(v);
- reverse(all(tops));
- used.assign(n, false);
- for (int v: tops) {
- if (used[v]) continue;
- rdfs(v);
- ++num_comp;
- }
- cgr.resize(num_comp);
- for (int v = 0; v < n; ++v) {
- for (int u: gr[v]) {
- int cv = comp[v], cu = comp[u];
- if (cv == cu) continue;
- cgr[cv].insert(cu);
- }
- }
- int ans = 0;
- for (int v = 0; v < num_comp; ++v)
- ans += sz(cgr[v]);
- return ans;
- }
- signed main() {
- fixstd();
- cin >> n >> m, init();
- for (int i = 0; i < m; ++i) {
- int v, u; cin >> v >> u, --v, --u;
- gr[v].pb(u), rgr[u].pb(v);
- }
- int ans = solve();
- write(ans);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement