Submission #1247427

#TimeUsernameProblemLanguageResultExecution timeMemory
1247427tvgk우호 조약 체결 (JOI14_friends)C++20
100 / 100
43 ms15944 KiB
#include<bits/stdc++.h> using namespace std; #define task "a" #define se second #define fi first #define ll long long #define ii pair<ll, ll> const long mxN = 1e5 + 7; int n, m; bool vis[mxN]; ll dsu[mxN]; vector<int> w[mxN]; int Find(int j) { if (dsu[j] < 0) return j; else return dsu[j] = Find(dsu[j]); } void Union(int u, int v) { u = Find(u); v = Find(v); if (u == v) return; dsu[v] += dsu[u]; dsu[u] = v; } void DFS(int j, int mut) { Union(j, mut); if (vis[j]) return; vis[j] = 1; for (int i : w[j]) DFS(i, mut); } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); //freopen(task".INP", "r", stdin); //freopen(task".OUT", "w", stdout); cin >> n >> m; for (int i = 1; i <= m; i++) { int u, v; cin >> u >> v; w[u].push_back(v); } for (int i = 1; i <= n; i++) dsu[i] = -1; for (int i = 1; i <= n; i++) { if (w[i].size() <= 1) continue; for (int j : w[i]) DFS(j, w[i][0]); } ll ans = 0; for (int i = 1; i <= n; i++) { if (dsu[i] < 0) ans += dsu[i] * (dsu[i] + 1); for (int j : w[i]) { if (Find(j) != Find(i)) ans++; } } cout << ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...