Cod sursa(job #1117890)

Utilizator BonCipBonciocat Ciprian Mircea BonCip Data 23 februarie 2014 20:54:05
Problema BFS - Parcurgere in latime Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.3 kb
#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 );
}