Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define se second
- #define fi first
- using namespace std;
- set < int > g[200010], comp;
- vector < int > obr;
- long long n, m, a, b, dn[200010],ans,xd;
- bool used[200010], used1[200010];
- void dfs(int v){
- used[v] = true;
- for(auto u: g[v]){
- if(!used[u]){
- dfs(u);
- }
- }
- obr.push_back(v);
- }
- void dfs1(int v){
- used1[v] = true;
- comp.insert(v);
- for(auto u: g[v]){
- if(!used1[u]){
- dfs1(u);
- }
- }
- }
- int main(){
- cin >> n >> m;
- for(int i = 1; i <= m; i++){
- cin >> a >> b;
- g[a].insert(b);
- }
- for(int i = 1; i <= n; i++){
- if(!used[i]){
- dfs(i);
- }
- }
- // reverse(obr.begin(), obr.end());
- for(auto x: obr){
- // cout << x << endl;
- if(!used1[x]){
- comp.clear();
- dfs1(x);
- if(comp.size() == 1){
- continue;
- }
- xd = comp.size() * (comp.size() - 1);
- for(auto u: comp){
- xd -= g[u].size();
- }
- ans = max(xd,ans);
- }
- }
- cout << ans;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement