Cod sursa(job #1262876)

Utilizator livliviLivia Magureanu livlivi Data 13 noiembrie 2014 17:02:55
Problema Componente tare conexe Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#include<cstdio>
#define MAX_M 200000
#define MAX_N 100000
using namespace std;

int lst[MAX_N+1];
int urm[MAX_M+1];
int v[MAX_M+1];
int m1;

int lst_inv[MAX_N+1];
int urm_inv[MAX_M+1];
int v_inv[MAX_M+1];
int m2;

int st[MAX_N+1];
int k;

int viz[MAX_N+1];

int comp[MAX_N+1];
int start[MAX_N+1];
int cnt,p;


void adauga1(int tip,int x){
    v[m1]=x;
    urm[m1]=lst[tip];
    lst[tip]=m1;
    m1++;
}

void adauga2(int tip,int x){
    v_inv[m2]=x;
    urm_inv[m2]=lst_inv[tip];
    lst_inv[tip]=m2;
    m2++;
}


void dfs1(int x){
    viz[x]=1;

    int i=lst[x];
    while(i!=0){
        if (viz[v[i]]==0) dfs1(v[i]);
        i=urm[i];
    }

    st[k]=x;
    k++;
}

void dfs2(int x){
    viz[x]=1;
    comp[p]=x;
    p++;

    int i=lst_inv[x];
    while(i!=0){
        if (viz[v_inv[i]]==0) dfs2(v_inv[i]);
        i=urm_inv[i];
    }
}


int main(){
    freopen ("ctc.in","r",stdin);
    freopen ("ctc.out","w",stdout);
    int n,m,i,x,y;

    scanf ("%d%d",&n,&m);

    m1=1;
    m2=1;
    for(i=1;i<=m;i++){
        scanf ("%d%d",&x,&y);
        adauga1(x,y);
        adauga2(y,x);
    }

    k=1;
    for(i=1;i<=n;i++)
        if (viz[i]==0) dfs1(i);

    for(i=1;i<=n;i++)
        viz[i]=0;

    cnt=0;
    p=1;
    for(k--;k>0;k--)
        if (viz[st[k]]==0){
            cnt++;
            start[cnt]=p;
            dfs2(st[k]);
        }

    printf ("%d\n",cnt);
    k=2;
    for(i=1;i<=n;i++){
        if (start[k]==i){
            k++;
            printf ("\n");
        }
        printf ("%d ",comp[i]);
    }

    return 0;
}