Pagini recente » Cod sursa (job #1425049) | Cod sursa (job #996693) | Cod sursa (job #995184) | Istoria paginii runda/eusebiu_oji_2011_cls11-12 | Cod sursa (job #2770724)
#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;
}