Cod sursa(job #247578)

Utilizator ZillaMathe Bogdan Zilla Data 23 ianuarie 2009 12:29:25
Problema BFS - Parcurgere in latime Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 kb
#include <stdio.h>

struct elem
{
	int nod;
	elem *next;
};
elem *p[100001];
struct coada
{
    int info;
    coada *adresa;
};
coada *varf,*sfarsit;

int vizitat_bf[100001],pasi[100001];

void adauga(int j,int k)
{
	elem *newel=new elem;
	newel->nod=k;
	if (p[j]==NULL)
		{
			p[j]=newel;
			newel->next=NULL;
		}
	else
		{
			newel->next=p[j];
			p[j]=newel;
		}
}

void add_coada(int x)
{
    coada *add=new coada;
    add->info=x;
    sfarsit->adresa=add;
    sfarsit=add;    
}


void  BF(int x)
{
    while(varf!=NULL)
        {
            elem *current=p[varf->info];           
            while(current!=NULL)
                {
                    if(vizitat_bf[current->nod]==0)
                        {
                            add_coada(current->nod);
                            pasi[current->nod]=pasi[varf->info]+1;
                            vizitat_bf[current->nod]=1;
                        }
                    current=current->next;
                }
            varf=varf->adresa;
        }   
}

int main()
{
    coada *add=new coada;
    int n,m,s,i,x,y;
    freopen("bfs.in","r",stdin);
    freopen("bfs.out","w",stdout);
    scanf("%d%d%d",&n,&m,&s);
    for(i=1;i<=m;++i)
        {
            scanf("%d%d",&x,&y);
            adauga(x,y);
        }
    add->info=s;
    varf=add;
    sfarsit=add;
	vizitat_bf[s]=1;
	BF(s);
	for(i=1;i<=n;++i)
	   {
            if(pasi[i]==0)
                {
                    if(i==s)
                        printf("0 ");
                    else
                        printf("-1 ");
                }
            else
                printf("%d ",pasi[i]);
        }
    return 0;    
}