Cod sursa(job #1262488)

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

struct mazi{int n1,n2;};

mazi v[MAX_M+1];
int st[MAX_N];
bool viz[MAX_N+1];
int lst[MAX_N+1];
int k;

int start[MAX_N+1];
int rez[MAX_N];
int poz;

bool meow1(mazi a,mazi b){
    if (a.n1<b.n1) return true;
    return false;
}
bool meow2(mazi a,mazi b){
    if (a.n2<b.n2) return true;
    return false;
}


void dfs(int p){
    int i;
    viz[p]=1;
    for(i=lst[p];v[i].n1==p;i++)
        if (viz[v[i].n2]==0) dfs(v[i].n2);

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

void dfs_inv(int p){
    int i;
    viz[p]=1;
    rez[poz]=p;
    poz++;

    for(i=lst[p];v[i].n2==p;i++)
        if (viz[v[i].n1]==0) dfs_inv(v[i].n1);
}


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

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

    for(i=1;i<=m;i++)
        scanf ("%d%d",&v[i].n1,&v[i].n2);

    sort(v+1,v+m+1,meow1);

    for(i=1;i<=m;i++)
        if (v[i].n1!=v[i-1].n1) lst[v[i].n1]=i;

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

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

    sort(v+1,v+m+1,meow2);
    for(i=1;i<=m;i++)
        if (v[i].n2!=v[i-1].n2) lst[v[i].n2]=i;



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

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