Cod sursa(job #247951)

Utilizator RegeleUmbrelorPopescu Mihai RegeleUmbrelor Data 24 ianuarie 2009 16:14:42
Problema BFS - Parcurgere in latime Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include<stdio.h>
const int nmax=100005, mmax=1000005;
int n,m,x0, d[nmax], *a[nmax];

void bfs(int x0)
{
	int coada[nmax],p=0,u=0,x,y,i;
	for(i=1;i<=n;++i)
		d[i]=-1;
	
	coada[u++]=x0;//adaug x0 in coada
	d[x0]=0;//calculez distanta :D :D :D :D :D
	while(p!=u)
	{
		x=coada[p++];//scot x din coada
		for(i=1;i<=a[x][0];++i)
		{
			y=a[x][i];
			if(d[y]==-1)
			{
				coada[u++]=y;
				d[y]=1+d[x];
			}
		}
	}
}

void citire()
{
	freopen("bfs.in","r",stdin);
	int x[mmax], y[mmax], i;
	scanf("%d%d%d",&n,&m,&x0);
	for(i=1;i<=m;i++)//citirea muchiilor
	{
		scanf("%d%d",&x[i],&y[i]);//citesc capetele muchiei
		++d[x[i]];//maresc numarul de vecini ai capatului initial;
	}
	for(i=1;i<=n;++i)//alocarea matricei
	{
		a[i]=new int[d[i]];
		a[i][0]=0;//a[i][0]=catzi vecini ai lui i am introdus;
	}
	for(i=1;i<=m;++i)//completarea matricei
		a[x[i]][++a[x[i]][0]]=y[i];//l-am adaugat pe y[i] in lista de vecini ai lui x[i];
}

int main()
{
	citire();
	bfs(x0);
	freopen("bfs.out","w",stdout);
	for(int i=1;i<=n;i++)
		printf("%d ", d[i]);
	return 0;
}