Cod sursa(job #2035467)

Utilizator Alex18maiAlex Enache Alex18mai Data 9 octombrie 2017 14:23:07
Problema BFS - Parcurgere in latime Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include <fstream>
#include <queue>

using namespace std;

ifstream cin ("bfs.in");
ofstream cout ("bfs.out");

struct edge{
    edge(){
        next_node = 0;
        next_edge = NULL;
    }
    int next_node;
    edge *next_edge;
};


bool used [100100];
int ans [100100];
edge *list[100100];
queue <int> Q;

class Graf {
public:
    Graf(){
        for (auto &x : list){
            x = NULL;
        }
    }
    void make_edge(int a , int b){
        Make_Edge(a , b);
    }
private:
    void Make_Edge(int a , int b){
        edge *now = new edge();
        now -> next_node = b;
        now -> next_edge = list[a];
        list[a] = now;
    }
};

void bfs(){
    while(!Q.empty()){
        int now = Q.front();
        Q.pop();
        for (edge *i = list[now]; i != NULL; i = i -> next_edge){
            int next_node = i -> next_node;
            if (!used[next_node]){
                Q.push(next_node);
                used[next_node] = true;
                ans[next_node] = ans[now] + 1;
            }
        }
    }
}

int main() {

    ios::sync_with_stdio(false);
    cin.tie(NULL);

    Graf *G = new Graf();

    int nodes , edges , s;
    cin>>nodes>>edges>>s;

    for (int i=1; i<=edges; i++){
        int a , b;
        cin>>a>>b;
        if (a == b){
            continue;
        }
        G -> make_edge(a , b);
    }
    Q.push(s);
    ans[s] = 0;
    used[s] = true;
    bfs();

    for (int i=1; i<=nodes; i++){
        if (ans[i] == 0 && i != s){
            cout<<-1<<" ";
        }
        else{
            cout<<ans[i]<<" ";
        }
    }

    return 0;
}