Cod sursa(job #247488)

Utilizator hasegandaniHasegan Daniel hasegandani Data 23 ianuarie 2009 08:58:11
Problema BFS - Parcurgere in latime Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
#include<stdio.h>
#include<vector>

#define nmax 100001

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

nod *lis[nmax];
int viz[nmax],n;

void add(nod *&,int);
void addc(nod *&,nod *&,int);
void sterg(nod *&);
void bfs(int);

int main()
{
    int m,x,a,y;
    freopen("bfs.in","r",stdin);
    freopen("bfs.out","w",stdout);
    scanf("%d%d%d",&n,&m,&a);
    for(;m;m--)
	{
            scanf("%d%d",&x,&y);
            if (x!=y)
                add(lis[x],y);
	}

    bfs(a);
    for(int i=1;i<=n;++i)
        printf("%d ",viz[i]);
    return 0;
}

void bfs(int a)
{
    memset(viz,-1,nmax);


    nod *inc=0,*sfc=0;
    addc(inc,sfc,a);
    viz[a]=0;
    
    for(;inc;sterg(inc))
        {
	    nod *p=lis[inc->info];
            for(;p;p=p->adr)
                if (viz[p->info]==-1)
                    {
                    addc(inc,sfc,p->info);
                    viz[p->info]=viz[inc->info]+1;
                    }
        }
}

void add(nod *&in,int inf)
{
    if (in)
        {
            nod *p=new nod;
            p->info=inf;
            p->adr=in;
            in=p;
        }
    else
        {
            nod *p=new nod;
            p->info=inf;
            in=p;
        }
}

void addc(nod *&inc,nod *&sfc,int inf)
{
    if (inc)
        {
	    nod *p=new nod;
	    p->info=inf;
            p->adr=0;
	    sfc->adr=p;
	    sfc=p;
        }
    else
        {
            nod *p=new nod;
	    p->info=inf;
            p->adr=0;
            inc=p;
            sfc=p;
        }
}

void sterg(nod *&inc)
{
    nod *p=inc->adr;
    delete inc;
    inc=p;
}