Cod sursa(job #1267896)

Utilizator Master011Dragos Martac Master011 Data 20 noiembrie 2014 14:16:46
Problema Componente tare conexe Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.98 kb
#include<cstdio>
using namespace std;

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

const int mMax = 200002;
int val1[mMax], urm1[mMax], lst1[mMax], n, m, nrv, v[mMax/2], nre, sol;
struct element{
    int val;
    int nr;
}comp[mMax/2];
int val2[mMax], urm2[mMax], lst2[mMax];
bool viz[mMax/2];

void dfs(int nod){
    viz[nod]=1;
    int vec = val1[lst1[nod]], pozu = lst1[nod];
    while(pozu!=-1){
        if(!viz[vec])
            dfs(vec);
        vec=val1[urm1[pozu]];
        pozu=urm1[pozu];
    }
    v[nrv++]=nod;
}

void dfs2(int nod){
    viz[nod]=1;
    comp[nre].val=nod;
    comp[nre++].nr=sol;
    int vec = val2[lst2[nod]], pozu = lst2[nod];
    while(pozu!=-1){
        if(!viz[vec])
            dfs2(vec);
        vec=val2[urm2[pozu]];
        pozu=urm2[pozu];
    }
}

int main(){
    fscanf(in,"%d%d",&n,&m);
    int x,y;
    for(int i = 0 ; i <= n ; i++) lst1[i] = lst2[i] = -1;

    for(int i = 0 ; i < m ; i++){
        fscanf(in,"%d%d",&x,&y);
        val1[i]=y;
        urm1[i]=lst1[x];
        lst1[x]=i;
    }
    int nod = 1;
    while(nrv < n){
        dfs(nod);
        nod++;
    }

    int vec, pozu, cnt = 0;
    for(int i = 1 ; i <= n ; i++){
        vec = val1[lst1[i]], pozu = lst1[i];
        while(pozu!=-1){
            val2[cnt]=i;
            urm2[cnt]=lst2[vec];
            lst2[vec]=cnt;
            //fprintf(out,"%d %d\n",vec,i);
            cnt++;
            vec=val1[urm1[pozu]];
            pozu=urm1[pozu];
        }
    }

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

    nod = nrv-1;
    sol = 0;
    while(nod > 0){
        if(!viz[v[nod]]){
            sol++;
            dfs2(v[nod]);
        }
        nod--;
    }

    fprintf(out,"%d\n",sol);
    nod = 0;
    for(int i = 1 ; i <= sol ; i++){
        while(comp[nod].nr==i){
            fprintf(out,"%d ", comp[nod].val);
            nod++;
        }
        fprintf(out,"\n");
    }
    return 0;
}