Cod sursa(job #797985)

Utilizator florin.ilieFlorin Ilie florin.ilie Data 15 octombrie 2012 13:38:17
Problema BFS - Parcurgere in latime Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <cstdio>

using namespace std;

int n,m,vf;
struct nod{
	int x;
	nod *urm;
};

struct varf{
	int lung;
	int viz;
	nod *p;
	nod *u;
}*a[1000000];

void adaugare_prim(int x,nod *&p,nod *&u)
{
	p=new nod;
	p->x=x;
	p->urm=NULL;
	u=p;
}

void adaugare_sf(int x,nod *&u)
{
	nod *q=new nod;
	q->x=x;
	q->urm=NULL;
	u->urm=q;
	u=q;
}
void citire ()
{
	freopen("bfs.in","r",stdin);
	int x,y;
	scanf("%d %d %d",&n,&m,&vf);
	for(int i=0;i<m;i++)
	{
		scanf("%d %d",&x,&y);
		if(!a[x]){
			a[x]=new varf;
			a[x]->viz=0;
			a[x]->lung=-1;
			adaugare_prim(y,a[x]->p,a[x]->u);
		}
		else
			adaugare_sf(y,a[x]->u);
	}
}
nod *c,*uc;
void latime (){
	adaugare_prim(vf,c,uc);
	a[vf]->viz=0;
	a[vf]->lung=0;
	for(nod *i=c; i; i=i->urm){
		int x=i->x;
		for(nod *j=a[x]->p;j;j=j->urm){
			if(a[j->x]->viz==0){
				adaugare_sf(j->x,uc);
				a[j->x]->viz=1;
				if(a[j->x]->lung>a[x]->lung || a[j->x]->lung==-1)
					a[j->x]->lung=a[x]->lung+1;

			}
		}
	}
}
void afisare ()
{
	freopen("bfs.out","w",stdout);
	for(int i=1;i<=n;i++)
		printf("%d ",a[i]->lung);
	printf("\n");
}
int main ()
{
	citire();
	latime();
	afisare();
	return 0;
}