Pagini recente » Cod sursa (job #885026) | Cod sursa (job #2574255) | Cod sursa (job #2767957) | Cod sursa (job #20196) | Cod sursa (job #1117890)
#include <stdio.h>
#include <limits.h>
#define N_MAX 100000
#define M_MAX 1000000
int N, M, queue[ 2 * N_MAX + 1 ], lq, rq;
int list[ M_MAX + 1 ], next[ M_MAX + 1 ], beg[ N_MAX + 1 ], end[ N_MAX + 1 ], sp;
int best[ N_MAX + 1 ];
void add( int n1, int n2 ) {
list[ ++ sp ] = n2;
if( beg[ n1 ] ) {
next[ end[ n1 ] ] = sp;
end[ n1 ] = sp;
} else {
beg[ n1 ] = end[ n1 ] = sp;
}
}
int main( ) {
FILE * fin, * fout;
fin = fopen( "bfs.in", "r" );
fout = fopen( "bfs.out", "w" );
int N, M, S;
fscanf( fin, "%d%d%d", &N, &M, &S );
int i;
for( i = 1; i <= M; i ++ ) {
int n1, n2;
fscanf( fin, "%d%d", &n1, &n2 );
add( n1, n2 );
}
for( i = 1; i <= N; i ++ ) {
best[ i ] = INT_MAX;
}
best[ S ] = 0;
lq = rq = 1;
queue[ 1 ] = S;
while( lq <= rq ) {
int here = queue[ lq ++ ];
int curr = beg[ here ];
while( curr ) {
if( best[ list[ curr ] ] == INT_MAX ) {
queue[ ++ rq ] = list[ curr ];
best[ list[ curr ] ] = best[ here ] + 1;
}
curr = next[ curr ];
}
}
for( i = 1; i <= N; i ++ ) {
fprintf( fout, "%d ", best[ i ] != INT_MAX ? best[ i ] : -1 );
}
fclose( fin );
fclose( fout );
}