Cod sursa(job #2770724)

Utilizator LucaMihaiLM10Luca Ilie LucaMihaiLM10 Data 22 august 2021 21:09:31
Problema Componente tare conexe Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.54 kb
#include <stdio.h>
#include <vector>

#define MAX_N 100000

using namespace std;

int ctc, o;
int viz[MAX_N], ord[MAX_N];
vector <int> ngb[MAX_N], ngbRev[MAX_N], comp[MAX_N];

void dfs( int nod ) {
    int i;

    viz[nod] = 1;
    for ( i = 0; i < ngb[nod].size(); i++ ) {
        if ( viz[ngb[nod][i]] == 0 )
            dfs( ngb[nod][i] );
    }
    ord[o] = nod;
    o++;
}

void dfsRev( int nod ) {
    int i;

    viz[nod] = 1;
    comp[ctc].push_back( nod );
    for ( i = 0; i < ngbRev[nod].size(); i++ ) {
        if ( viz[ngbRev[nod][i]] == 0 )
            dfsRev( ngbRev[nod][i] );
    }
}

int main() {
    FILE *fin, *fout;
    int n, m, a, b, i, j;

    fin = fopen( "ctc.in", "r" );
    fscanf( fin, "%d%d", &n, &m );
    for ( i = 0; i < m; i++ ) {
        fscanf( fin, "%d%d", &a, &b );
        a--;
        b--;
        ngb[a].push_back( b );
        ngbRev[b].push_back( a );
    }
    fclose( fin );

    o = 0;
    for ( i = 0; i < n; i++ ) {
        if ( viz[i] == 0 )
            dfs( i );
    }

    for ( i = 0; i < n; i++ )
        viz[i] = 0;
    ctc = 0;
    for ( i = n - 1; i >= 0; i-- ) {
        if ( viz[ord[i]] == 0 ) {
            dfsRev( ord[i] );
            ctc++;
        }
    }

    fout = fopen( "ctc.out", "w" );
    fprintf( fout, "%d\n", ctc );
    for ( i = 0; i < ctc; i++ ) {
        for ( j = 0; j < comp[i].size(); j++ )
            fprintf( fout, "%d ", comp[i][j] + 1 );
        fprintf( fout, "\n" );
    }
    fclose( fout );

    return 0;
}