Cod sursa(job #1770738)

Utilizator JohnnyKiteFlorin Smeu JohnnyKite Data 4 octombrie 2016 19:40:46
Problema BFS - Parcurgere in latime Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
#include <fstream>
#include <vector>
#include <queue>

class BasicDirectedGraph
{
    int mSize;
    std::vector<int> *mEdges;
public:
    BasicDirectedGraph(int size)
    {
        mSize = size;
        mEdges = new std::vector<int>[size+1];
    }
    void addEdge(int a, int b)
    {
        mEdges[a].push_back(b);
    }
    std::vector<int> getDistancesFromSource(int source)
    {
        std::vector<int> distances(mSize + 1, -1);
        distances[source] = 0;
        std::queue<int> bfs_queue;
        bfs_queue.push(source);

        while (!bfs_queue.empty()) {
            int tmp = bfs_queue.front();
            bfs_queue.pop();
            for (int x : mEdges[tmp]) {
                if (distances[x] == -1) {
                    distances[x] = distances[tmp] + 1;
                    bfs_queue.push(x);
                }
            }
        }
        return distances;
    }
    ~BasicDirectedGraph()
    {
        delete[] mEdges;
    }
};

int main()
{
    std::ifstream inputStream("bfs.in");
    std::ofstream outputStream("bfs.out");
    int n, m, s;

    inputStream >> n >> m >> s;
    BasicDirectedGraph graph(n);
    for(int i = 0; i < m; ++i) {
        int a, b;
        inputStream >> a >> b;
        graph.addEdge(a, b);
    }

    auto distances = graph.getDistancesFromSource(s);

    for(int i = 1; i < distances.size(); ++i) outputStream << distances[i] << ' ';
    outputStream << '\n';

    return 0;
}