12382022-03-27 21:23:05k_balintHálózatjavításcpp14Accepted 50/509ms7528 KiB
#include <bits/stdc++.h>
using namespace std;
const int c=10004;

int n,m;
vector<int> adj[c];
int vis[c],par[c];
int st,en;
vector<int> cycle;
int len;

bool find_cycle(int v){
    vis[v]=1;
    for(int x:adj[v]){
        if(!vis[x]){
            par[x]=v;
            if(find_cycle(x)) return 1;
        }
        else if(vis[x]==1){
            st=x; en=v;
            return 1;
        }
    }
    vis[v]=2;
    return 0;
}

int ord[c],best[c];

int d(int rt, int a){
    if(a==0) return -1;
    if(rt < a) return a-rt;
    return len+a-rt;
}

void dfs(int v, int rt){
    vis[v]=1;
    for(int x:adj[v]){
        if(ord[x] != 0){
            if(v==rt && d(ord[rt],ord[x])==1) continue;
            if(d(ord[rt],best[v])<d(ord[rt],ord[x])) best[v]=ord[x];
            continue;
        }
        if(!vis[x]){
            dfs(x,rt);
        }
        if(d(ord[rt],best[v]) < d(ord[rt],best[x])) best[v]=best[x];
    }
}

int bad[2*c];
vector<pair<int,int>> ans;

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);

    cin>>n>>m;
    for(int i=1;i<=m;i++){
        int a,b; cin>>a>>b;
        adj[a].push_back(b);
    }

    for(int i=1;i<=n;i++){
        if(!vis[i]){
            if(find_cycle(i)) break;
        }
    }

    while(en!=st){
        cycle.push_back(en);
        en=par[en];
    }
    cycle.push_back(st);
    len=cycle.size();

    reverse(cycle.begin(),cycle.end());

    for(int i=0;i<len;i++){
        ord[cycle[i]]=i+1;
    }

    for(int i=1;i<=n;i++){
        vis[i]=0;
    }

    for(int x:cycle){
        dfs(x,x);
        if(best[x] != 0){
            bad[ord[x]]++;
            bad[ord[x]<best[x]?best[x]:len+best[x]]--;
        }
    }

    for(int i=1;i<=2*len;i++){
        bad[i]+=bad[i-1];
    }

    for(int i=1;i<=len;i++){
        if(bad[i]+bad[i+len]==0){
            ans.push_back(make_pair(cycle[i-1],cycle[i%len]));
        }
    }

    cout << ans.size() << '\n';
    for(pair<int,int> x : ans){
        cout << x.first << ' ' << x.second << '\n';
    }
}
SubtaskSumTestVerdictTimeMemory
base50/50
1Accepted0/02ms2548 KiB
2Accepted0/07ms5064 KiB
3Accepted1/11ms2748 KiB
4Accepted1/11ms2764 KiB
5Accepted1/12ms2776 KiB
6Accepted1/12ms3024 KiB
7Accepted1/12ms3040 KiB
8Accepted2/22ms3316 KiB
9Accepted2/23ms3352 KiB
10Accepted2/22ms3096 KiB
11Accepted2/23ms3668 KiB
12Accepted2/22ms3196 KiB
13Accepted2/24ms4260 KiB
14Accepted2/24ms4084 KiB
15Accepted2/26ms4808 KiB
16Accepted2/24ms4536 KiB
17Accepted2/26ms5260 KiB
18Accepted2/29ms5932 KiB
19Accepted2/26ms5820 KiB
20Accepted2/27ms6252 KiB
21Accepted2/27ms6444 KiB
22Accepted2/27ms6604 KiB
23Accepted3/37ms6796 KiB
24Accepted4/47ms6964 KiB
25Accepted4/47ms7176 KiB
26Accepted4/48ms7528 KiB