Cod sursa(job #1262489)

Utilizator usermeBogdan Cretu userme Data 13 noiembrie 2014 11:31:58
Problema Componente tare conexe Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <cstdio>

FILE*f=fopen("ctc.in","r");
FILE*h=fopen("ctc.out","w");

struct lista{
    int urm,val;
};

lista graf[200001],invg[200001],rez[100001];

int n,m,st[100001],lst[100001],cap,nr,invl[100001],invc,varf[100001],comp;

bool pas[100001];

void dfs(int x){
    if ( pas[x]==1 )return;
    pas[x]=1;
    int it=lst[x];
    while ( it!=0 ){
        dfs(graf[it].val);
        it=graf[it].urm;
    }
    st[++nr]=x;
}

void dfss(int x){
    if ( pas[x]==1 )return;
    pas[x]=1;
    rez[++nr].val=x;
    rez[nr].urm=varf[comp];
    varf[comp]=nr;
    int it=invl[x];
    while ( it!=0 ){
        dfss(invg[it].val);
        it=invg[it].urm;
    }
}

int main(){
    fscanf(f,"%d%d",&n,&m);
    for ( int i=1;i<=m;++i ){
        int x,y;
        fscanf(f,"%d%d",&x,&y);
        graf[++cap].val=y;
        graf[cap].urm=lst[x];
        lst[x]=cap;
        invg[++invc].val=x;
        invg[invc].urm=invl[y];
        invl[y]=invc;
    }
    for ( int i=1;i<=n;++i )
        if ( pas[i]==0 )
            dfs(i);
    for ( int i=1;i<=n;++i )
        pas[i]=0;
    nr=0;
    for ( int i=n;i>=1;--i )
        if ( pas[st[i]]==0 ){
            ++comp;
            dfss(st[i]);
        }
    fprintf(h,"%d\n",comp);
    for ( int i=1;i<=comp;++i ){
        int it=varf[i];
        while ( it!=0 ){
            fprintf(h,"%d ",rez[it].val);
            it=rez[it].urm;
        }
        fprintf(h,"\n");
    }
    return 0;
}