Cod sursa(job #1502925)

Utilizator TarabanDragosTaraban Dragos-Petru TarabanDragos Data 15 octombrie 2015 11:10:11
Problema Componente tare conexe Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 3.04 kb
#include<cstdio>
#include<vector>
#include<stack>
using namespace std;
vector<int>L[300],S[300],R[300];
stack<int>s;
struct muc{
    int x;
    int y;
}Q[300];
int n,m,i,j,k,a,b,nr,nrr,ni,no,v[300],x[300],low[300],niv[300],gc[300],I[300],O[300],y[300][300],H[300],E[300];
FILE *f,*g;
int minim(int a,int b){
    if(a<b)
        return a;
    return b;
}
int maxim(int a,int b){
    if(a>b)
        return a;
    return b;
}
void dfs(int nod){
    v[nod]=x[nod]=1;
    a++;
    low[nod]=niv[nod]=a;
    s.push(nod);
    for(int i=0;i<L[nod].size();i++){
        if(v[ L[nod][i] ]==0){
            dfs(L[nod][i]);
            low[nod]=minim( low[nod] , low[ L[nod][i] ] );
        }
        else if(x[ L[nod][i] ]==1)
            low[nod]=minim( low[nod] , low[ L[nod][i] ] );
    }
    if(low[nod]==niv[nod]){
        nr++;
        do{
            b=s.top();
            s.pop();
            x[b]=0;
            gc[b]=nr;
            S[nr].push_back(b);
        }while(b!=nod);
    }
}
void dfss(int nod){
    v[nod]=1;
    if(O[nod]==0)
        a=nod;
    for(int i=0;i<R[nod].size();i++){
        if( v[ L[nod][i] ] == 0 )
            dfs( L[nod][i] );
    }
}
int main(){
    f=fopen("plan.in","r");
    g=fopen("plan.out","w");
    fscanf(f,"%d%d",&n,&m);
    for(i=1;i<=m;i++){
        fscanf(f,"%d%d",&a,&b);
        L[a].push_back(b);
    }
    a=0;
    for(i=1;i<=n;i++){
        if(v[i]==0){
            dfs(i);
        }
    }
    for(i=1;i<=nr;i++){
        for(j=0;j<S[i].size();j++){
            a=S[i][j];
            for(k=0;k<L[a].size();k++){
                if( i != gc[ L[a][k] ] && y[i][ gc[ L[a][k] ] ] == 0 ){
                    R[i].push_back( gc[ L[a][k] ] );
                    I[ gc[ L[a][k] ] ]++;
                    O[i]++;
                    y[i][ gc[ L[a][k] ] ]=1;
                }
            }
        }
        v[i]=0;
    }
    for(i=1;i<=nr;i++){
        if(I[i]==0)
            ni++;
        if(O[i]==0)
            no++;
    }
    fprintf(g,"%d\n",maxim(ni,no));
    for(i=1;i<=nr;i++){
        if(v[i]==0&&I[i]==0){
            dfss(i);
            R[a].push_back(i);
            O[a]++;
            I[i]++;
            Q[++nrr].x=S[a][0];
            Q[nrr].y=S[i][0];
        }
    }
    ni=no=0;
    for(i=1;i<=nr;i++){
        if(I[i]==0)
            H[++ni]=i;
        if(O[i]==0)
            E[++no]=i;
    }
    a=minim(ni,no);
    for(i=1;i<=a;i++){
        R[ E[i] ].push_back( H[i] );
        Q[++nrr].x=S[ E[i] ][0];
        Q[nrr].y=S[ H[i] ][0];
    }
    if(ni-a!=0){
        for(i=a+1;i<=ni;i++){
            R[ E[a] ].push_back(H[i]);
            Q[++nrr].x=S[ E[a] ][0];
            Q[nrr].y=S[ H[i] ][0];
        }
    }
    if(no-a!=0){
        for(i=a+1;i<=no;i++){
            R[ E[i] ].push_back(H[a]);
            Q[++nrr].x=S[ E[i] ][0];
            Q[nrr].y=S[ H[a] ][0];
        }
    }
    for(i=1;i<=nrr;i++){
        fprintf(g,"%d %d\n",Q[i].x,Q[i].y);
    }
    fclose(f);
    fclose(g);
    return 0;
}