Cod sursa(job #1366418)

Utilizator gabrielinelusGabriel-Robert Inelus gabrielinelus Data 1 martie 2015 00:56:44
Problema BFS - Parcurgere in latime Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.75 kb
#include <cstdio>
#include <string>
#include <sstream>
#include <vector>
#include <queue>
#include <iostream>
#include <algorithm>

#define INF 0x3f3f3f3f

using namespace std;

class Graph{
private:
    vector< vector<int> > G;
    vector<int> Distance;
    queue<int> Q;
    string answer;
    int Size;
public:
    Graph(void){}
    void Resize(int k){
        G.resize(k);
        Distance.resize(k);
        Size = k;
    }
    void Add_edge(int a,int b){
        G[a - 1].push_back(b - 1);
    }
    string Compute_Distance(int k){
        --k;
        answer = "";
        Distance.assign(Size,0);
        Distance[k] = 1;
        Q.push(k);
        while(!Q.empty())
        {
            k = Q.front(); Q.pop();
            for(vector<int>::iterator it = G[k].begin(); it != G[k].end(); ++it)
                if(Distance[*it] == 0)
                {
                    Distance[*it] = Distance[k] + 1;
                    Q.push(*it);
                }
        }
        for(vector<int>::iterator it = Distance.begin(); it != Distance.end(); ++it)
            if(*it)
            {
                stringstream aux;
                aux << *it - 1;
                answer += aux.str();
                answer += " ";
            }
            else
                answer += "-1 ";
        return answer;
    }
};

Graph Graf;
int N,M,x;

void Read()
{
    scanf("%d%d%d",&N,&M,&x);
    Graf.Resize(N);
    int a,b;
    for(int i = 1; i <= M; ++i){
        scanf("%d%d",&a,&b);
        Graf.Add_edge(a,b);
    }
}

void Solve(){
    cout << Graf.Compute_Distance(x);
}

int main()
{
    freopen("bfs.in","r",stdin);
    freopen("bfs.out","w",stdout);

    Read();
    Solve();

    return 0;
}