Submission #1186137

#TimeUsernameProblemLanguageResultExecution timeMemory
1186137JooDdae우호 조약 체결 (JOI14_friends)C++20
100 / 100
49 ms8008 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

int n, m, p[100100], s[100100], chk[100100];
vector<int> v[100100];
queue<int> q;

int find(int x) { return x == p[x] ? x : p[x] = find(p[x]); }

void merge(int x, int y) { 
	if((x = find(x)) == (y = find(y))) return;
	p[x] = y, s[y] += s[x];
}

int main() {
	cin.tie(0)->sync_with_stdio(0);
	cin >> n >> m;
	for(int i=1;i<=m;i++) {
		int x, y; cin >> x >> y;
		v[x].push_back(y);
	}

	iota(p, p+1+n, 0), fill(s, s+1+n, 1);
	for(int i=1;i<=n;i++) {
		for(int j=1;j<v[i].size();j++) {
			merge(v[i][j-1], v[i][j]);
		}
	}

	for(int i=1;i<=n;i++) if(s[find(i)] > 1) q.push(i), chk[i] = 1;
	while(!q.empty()) {
		int u = q.front(); q.pop();
		for(auto x : v[u]) {
			merge(u, x);
			if(!chk[x]) q.push(x), chk[x] = 1;
		}
	}

	ll ans = 0;
	for(int i=1;i<=n;i++) if(i == find(i)) ans += 1ll*s[i]*(s[i]-1);
	for(int i=1;i<=n;i++) for(int j : v[i]) if(find(i) != find(j)) ans++;
	cout << ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...