Submission #156092

#TimeUsernameProblemLanguageResultExecution timeMemory
156092IOrtroiii우호 조약 체결 (JOI14_friends)C++14
100 / 100
112 ms7164 KiB
#include <bits/stdc++.h> using namespace std; const int N = 100100; int n, m; vector<int> g[N]; int par[N]; int sz[N]; bool visit[N]; int find(int v) { if (par[v] != v) { par[v] = find(par[v]); } return par[v]; } void merge(int v, int u) { v = find(v); u = find(u); if (v == u) { return; } else { par[u] = v; sz[v] += sz[u]; } } int main() { ios_base::sync_with_stdio(false); int n, m; cin >> n >> m; for (int i = 1; i <= m; ++i) { int v, u; cin >> v >> u; g[v].emplace_back(u); } iota(par + 1, par + n + 1, 1); fill(sz + 1, sz + n + 1, 1); for (int i = 1; i <= n; ++i) { for (int j = 0; j + 1 < (int) g[i].size(); ++j) { merge(g[i][j], g[i][j + 1]); } } queue<int> q; for (int i = 1; i <= n; ++i) { if (sz[find(i)] > 1) { visit[i] = true; q.emplace(i); } } while (!q.empty()) { int v = q.front(); q.pop(); for (auto u : g[v]) { if (!visit[u]) { visit[u] = true; q.emplace(u); } merge(v, u); } } long long ans = 0; for (int i = 1; i <= n; ++i) { if (par[i] == i) { ans += (long long) sz[i] * (sz[i] - 1); } } for (int i = 1; i <= n; ++i) { for (int j : g[i]) { if (find(i) != find(j)) { ++ans; } } } cout << ans << "\n"; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...