#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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |