Cod sursa(job #325109)

Utilizator TabaraTabara Mihai Tabara Data 18 iunie 2009 22:14:47
Problema BFS - Parcurgere in latime Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.02 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define in "bfs.in"
#define out "bfs.out"
#define NMAX 100005

#define ALB 0
#define GRI 1
#define NEGRU 2

#define INF (1<<30)

typedef struct nod {
	int vf;
	struct nod *next;
} *PNOD, NOD;

PNOD L[NMAX];
int N, M, S, p,u, d[NMAX], sel[NMAX];
int q[NMAX];

void Add ( int i, int j )
{
	PNOD p = (PNOD)calloc ( 1, sizeof(NOD) );
	p->vf = j;
	p->next = L[i];
	L[i] = p;
}

void BFS()
{
	int i; PNOD j;

	for ( i = 1; i <= N; ++i ) d[ i ] = -1;
	q[ p = u = 1 ] = S;
	d[ S ] = 0; sel [ S ] = GRI;

	while ( p <= u )
	{
		i = q[p];
		for ( j = L[i]; j; j = j->next )
			if ( sel[j->vf] == ALB  )
			{
				d[ j->vf ] = d[i] + 1;
				sel[ j ->vf ] = GRI;
				q[ ++u ] = j->vf;
			}
		p++;
		sel[i] = NEGRU;
	}
}

int main ( void )
{
	freopen ( in, "r", stdin );
	freopen ( out, "w", stdout );

	scanf ( "%d%d%d", &N, &M, &S );

	int i, j;
	for ( ; M > 0; --M ) {
		scanf ( "%d%d", &i, &j );
		Add ( i, j );
	}
	BFS ( S );
	for ( i = 1; i <= N; ++i )
		printf ( "%d ", d[i] );
	
	return 0;
}