Cod sursa(job #864844)

Utilizator AlexandruValeanuAlexandru Valeanu AlexandruValeanu Data 25 ianuarie 2013 19:53:39
Problema BFS - Parcurgere in latime Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
#include <bitset>


using namespace std;

#define Nmax 100001

struct nod{

    int info;
    nod *next;
};

nod *Graf[Nmax];

bitset <Nmax> viz;
queue <int> Q;

int dist[Nmax];

int N, M, R;
int a, b;

void citire(){

    freopen("bfs.in", "r", stdin);

    scanf("%d %d %d", &N, &M, &R);

    for(; M; M--){

        scanf("%d %d", &a, &b);

        nod *c = new nod;

        c->info = b;
        c->next = Graf[a];
        Graf[a] = c;
    }
}

void init(){

    dist[R] = 0;
    Q.push(R);
    viz[R] = 1;
}

void bfs(){

    while(!Q.empty()){

        int current = Q.front();
        Q.pop();

        nod *p = Graf[current];

        nod *c = p;

        while(c){

            if(!viz[c->info])
                dist[c->info] = dist[current] + 1,
                viz[c->info] = 1,
                Q.push(c->info);

            c = c->next;
        }
    }

    for(int i = 1; i <= N; i++)
        if(dist[i] == 0 && i != R)
            dist[i] = -1;
}

void afis(){

    freopen("bfs.out", "w", stdout);

    for(int i = 1; i<= N; i++)
        printf("%d ", dist[i]);
}

int main(){

    citire();
    init();
    bfs();
    afis();

    return 0;
}