Cod sursa(job #281528)

Utilizator adelinavVidovici Adelina adelinav Data 15 martie 2009 11:37:36
Problema BFS - Parcurgere in latime Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include<stdio.h>
#define MMAX 1000000
#define NMAX 100000

int n,m,s;

struct muchie{
	int a, b;
};

muchie vm[MMAX+1];

struct nod{
	int info;
	nod *adr;
};

struct lista{
	nod *vf, *sf;
};

lista vl[NMAX+1];

int coada[NMAX+1],li=1,ls=0;

int d[NMAX+1];

int viz[NMAX+1];

void pune(lista &l,int x){
	nod *n=new nod;
	n->info=x;
	n->adr=NULL;
	if(!l.vf) l.vf=n;
	else l.sf->adr=n;
	l.sf=n;
}

void punec(int x){
	ls++;
	coada[ls]=x;
	viz[x]=1;
}

void scoatec(int &x){
	x=coada[li];
	li++;
}

int coadavida(){
	return li>ls;
}

int main(){
	freopen("bfs.in","r",stdin);
	freopen("bfs.out","w",stdout);
	
	int i;
	scanf("%d%d%d",&n,&m,&s);
	for(i=1;i<=m;i++)
		scanf("%d%d",&vm[i].a,&vm[i].b);
	for(i=1;i<=m;i++) 
		pune(vl[vm[i].a],vm[i].b);
	punec(s);
	while(!coadavida()){
		int x;
		scoatec(x);
		nod *nc=vl[x].vf;
 		while(nc){
			int y=nc->info;
			if(!viz[y]){ 
				punec(y);
				d[y]=d[x]+1;
			}
			nc=nc->adr;
		}
	}
	for(i=1;i<=n;i++) 
		if(!d[i]) d[i]=-1;
	d[s]=0;
	for(i=1;i<=n;i++)
		printf("%d ",d[i]);
	return 0;
}