Cod sursa(job #561204)

Utilizator ursu-valiJerdea Florin ursu-vali Data 19 martie 2011 01:27:23
Problema BFS - Parcurgere in latime Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include<stdio.h>
#include<vector>
#define infile "bfs.in"
#define outfile "bfs.out"
#define noduri 100002
#define muchii 1000002

using namespace std;

long n,m,start; //nr de noduri, de muchii si nodul de start
long viz[noduri];//am ajuns la nodul i parcurgand viz[i] pasi
long coada[noduri];//coada
long s,f;//pozitia la care suntem si poz de sfarsit a cozii
long nrv[noduri];//numarul vecinilor nodului i;

vector<long> a[noduri];

void read()
{
	long i,x,y;
	scanf("%ld %ld %ld",&n,&m,&start);
	for(i=1;i<=m;i++)
	{
		scanf("%ld %ld",&x,&y);
		a[x].push_back(y);
		nrv[x]++;
	}
	for(i=1;i<=n;i++)
		viz[i]=-1;
}

void bfs()
{
	long s,f,k,i,j,nod,ok=1;
	s=1;
	f=1;
	coada[s]=start;
	viz[start]=0;
	while(ok)
	{
	k=0;
	for(i=s;i<=f;i++)
	{
		nod=coada[i];
		for(j=0;j<nrv[nod];j++)
		{
			if(viz[a[nod][j]]==-1)
			{
				k++;
				coada[f+k]=a[nod][j];
				viz[a[nod][j]]=viz[nod]+1;
			}
		}
	}
	s=f+1;
	f+=k;
	if(!k)
		ok=0;
	}
}

void write()
{
	long i;
	for(i=1;i<=n;i++)
		printf("%ld ",viz[i]);
}
int main()
{
	freopen(infile,"r",stdin);
	freopen(outfile,"w",stdout);
	read();
	bfs();
	write();
	fclose(stdin);
	fclose(stdout);
	return 0;
}