Cod sursa(job #228875)

Utilizator gabitzish1Gabriel Bitis gabitzish1 Data 8 decembrie 2008 17:07:28
Problema BFS - Parcurgere in latime Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include <cstdio>
#include <vector>

using namespace std;

int N, M, S, dist[100005], c[100005], viz[100005], n[100005];
vector <int> v[100005];

#define DIM 8192

char ax[DIM+16];
int pz;

inline void cit(int &x)
{
	x=0;
	while((ax[pz]<'0' || ax[pz]>'9') && (ax[pz]!='-'))
		if(++pz==DIM)fread(ax, 1, DIM, stdin), pz=0;

	
	int neg=0;
	if(ax[pz]=='-')
	{
		neg=1;
		if(++pz==DIM)fread(ax, 1, DIM, stdin),pz=0;
	}
	
	while(ax[pz]>='0' && ax[pz]<='9')
	{
		x=x*10+ax[pz]-'0';
		if(++pz==DIM)fread(ax,1, DIM, stdin),pz=0;
	}
	if(neg) x=-x;
}

void citire()
{
	freopen("bfs.in","r",stdin);
	freopen("bfs.out","w",stdout);

	int i, x, y;
	scanf("%d %d %d",&N,&M,&S);
	for (i = 1; i <= M; i++)
	{
		cit(x); cit(y);		
		v[x].push_back(y);
	}
	for (i = 1; i <= N; i++) 
	{
		dist[i] = -1;
		n[i] = v[i].size();
	}
	dist[S] = 0;
}

void bfs()
{
	int p, u, poz, i;	
	p = u = 0;
	c[0] = S; viz[S] = 1;
	while (p <= u)
	{
		poz = p % 100000;
		for (i = 0; i < n[c[poz]]; i++)
			if (!viz[v[c[poz]][i]])
			{
				u++;
				c[u % 100000] = v[c[poz]][i];
				dist[v[c[poz]][i]] = dist[c[poz]] + 1;
				viz[v[c[poz]][i]] = 1;
			}
		p++;
	}
}


int main()
{
	citire();
	bfs();
	for (int i = 1; i <= N; i++) printf("%d ",dist[i]);
	return 0;
}