Cod sursa(job #884608)

Utilizator paulbotabota paul paulbota Data 21 februarie 2013 08:36:51
Problema BFS - Parcurgere in latime Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <cstdio>
#include <queue>

#define MAXN 100010
#define inf 1<<30
#define FOR(i,a,b) for(i=a;i<=b;i++)

using namespace std;

struct graf
{
  int nod;
  graf *next;
};

graf *a[MAXN];
int n,m,s,d[MAXN];
bool inqueue[MAXN];
queue<int> h;

inline void read()
{
    freopen("bfs.in","r",stdin);
    freopen("bfs.out","w",stdout);
    scanf("%d %d %d",&n,&m,&s);
    int i;
    FOR(i,1,m)
    {
        int x,y;
        scanf("%d %d",&x,&y);
        graf *q=new graf;
        q->nod=y;
        q->next=a[x];
        a[x]=q;
    }
}

inline void bfs(int start)
{
    int i;
    FOR(i,1,n)
    {
        d[i]=inf;
        inqueue[i]=false;
    }
    h.push(start);
    inqueue[start]=true;
    d[start]=0;
    while(!h.empty())
    {
        int min=h.front();
        h.pop();
        graf *q=a[min];
        while(q)
        {
            if(inqueue[q->nod]==false)
            {
                h.push(q->nod);
                inqueue[q->nod]=true;
                d[q->nod]=d[min]+1;
            }
            q=q->next;
        }
    }
}

inline void print()
{
    int i;
    FOR(i,1,n)
    {
        if(d[i]==inf)
            printf("-1 ");
        else
            printf("%d ",d[i]);
    }
    printf("\n");
}

int main()
{
    read();
    bfs(s);
    print();
    return 0;
}