Cod sursa(job #2498873)

Utilizator bogdi1bogdan bancuta bogdi1 Data 24 noiembrie 2019 18:08:57
Problema Zoo Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.33 kb
#include <cstdio>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;
vector<int> g[260];
vector<int> gt[260];
vector<int> l;
vector<int> gcomp[260];
int in[260];
int out[260];
bool ff[260];
vector<int> intro;
vector<int> outro;
struct Solutie
{
    int x,y;
};
Solutie sol[260];
Solutie perechi[260];
int f[260];
bool viz[260];
int cont;
vector<int> comp[260];
void dfs(int nod)
{
    viz[nod]=1;
    for(int v : g[nod])
        if(!viz[v])
            dfs(v);
    l.push_back(nod);
}
void dfst(int nod)
{
    viz[nod]=1;
    for(int v : gt[nod])
        if(!viz[v])
            dfst(v);
    comp[cont].push_back(nod);
    f[nod]=cont;
}
int main()
{   freopen("plan.in", "r", stdin);
    freopen("plan.out", "w", stdout);
    int n,m,i,x,y,j,k=0,ans=0;
    scanf("%d%d", &n, &m);
    for(i=1; i<=m; i++){
        scanf("%d%d", &x, &y);
        g[x].push_back(y);
        gt[y].push_back(x);
    }
    for(i=1; i<=n; i++)
        if(!viz[i])
            dfs(i);
    reverse(l.begin(), l.end());
    for(int u : l)
        viz[u]=0;
    for(int u : l){
        if(!viz[u]){
            cont++;
            dfst(u);
        }
    }
    for(i=1; i<=n; i++)
        for(j=0; j<g[i].size(); j++)
            if(f[i]!=f[g[i][j]]){
                gcomp[f[i]].push_back(f[g[i][j]]);
                out[f[i]]++;
                in[f[g[i][j]]]++;
            }
    for(i=1; i<=cont; i++){
        if(in[i]==0)
            intro.push_back(i);
        if(out[i]==0){
            outro.push_back(i);
            ff[i]=1;
        }
    }
    for(i=0; i<=255; i++)
        viz[i]=0;
    for(i=0; i<intro.size(); i++)
        for(j=0; j<gcomp[intro[i]].size(); j++)
            if(ff[gcomp[intro[i]][j]]==1 && viz[gcomp[intro[i]][j]]==0){
                viz[gcomp[intro[i]][j]]=1;
                viz[intro[i]]=1;
                perechi[++k].x=intro[i];
                perechi[k].y=gcomp[intro[i]][j];
            }
    for(i=1; i<k; i++){
        sol[++ans].x=comp[perechi[i].y][0];
        sol[ans].y=comp[perechi[i+1].x][0];
    }
    sol[++ans].x=comp[perechi[k].y][0];
    sol[ans].y=comp[perechi[1].x][0];
    for(i=0; i<intro.size(); i++)
        if(viz[intro[i]]==0){
            sol[++ans].x=comp[perechi[1].x][0];
            sol[ans].y=comp[intro[i]][0];
        }
    for(i=0; i<outro.size(); i++)
        if(viz[outro[i]]==0){
            sol[++ans].y=comp[perechi[1].x][0];
            sol[ans].x=comp[outro[i]][0];
        }
    i=0;
    j=0;
    while(i<intro.size() && j<outro.size()){
        while(i<intro.size() && viz[intro[i]]==1)
            i++;
        while(j<outro.size() && viz[outro[j]]==1)
            j++;
        if(i<intro.size() && j<outro.size()){
        sol[++ans].x=comp[intro[i]][0];
        sol[ans].y=comp[outro[j]][0];
        x=intro[i];
        y=outro[j];
        i++;
        j++;
        }
    }
    for(; i<intro.size(); i++){
        if(viz[intro[i]]==0){
        sol[++ans].x=comp[intro[i]][0];
        sol[ans].y=comp[y][0];
        }
    }
    for(; j<outro.size(); j++){
        if(viz[outro[j]]==0){
        sol[++ans].x=comp[x][0];
        sol[ans].y=comp[outro[j]][0];
        }
    }
    printf("%d\n", ans);
    for(i=1; i<=ans; i++)
        printf("%d %d\n", sol[i].x, sol[i].y);
    return 0;
}