Cod sursa(job #2466711)

Utilizator igsifvevc avb igsi Data 2 octombrie 2019 20:25:12
Problema BFS - Parcurgere in latime Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.26 kb
#include <algorithm>
#include <fstream>
#include <iterator>
#include <queue>
#include <tuple>
#include <vector>

using graph_t = std::vector<std::vector<int>>;

std::vector<int> solve(const graph_t &G, int s)
{
    std::queue<int> Q;
    std::vector<int> D(G.size(), -1);

    D[s] = 0;
    Q.push(s);

    while (!Q.empty())
    {
        auto u = Q.front();
        Q.pop();

        for (auto v : G[u])
        {
            if (D[v] == -1)
            {
                D[v] = D[u] + 1;
                Q.push(v);
            }
        }
    }

    return D;
}

std::pair<graph_t, int> read();
void write(const std::vector<int> &D);

int main()
{
    graph_t G;
    int s;

    std::tie(G, s) = read();
    auto D = solve(G, s);
    write(D);

    return 0;
}

std::pair<graph_t, int> read()
{
    std::ifstream fin("bfs.in");
    int n, m, s, u, v;

    fin >> n >> m >> s;
    s--;

    graph_t G(n, std::vector<int>());
    while (fin >> u >> v)
    {
        u--, v--;
        G[u].push_back(v);
    }

    return std::make_pair(G, s);
}

void write(const std::vector<int> &D)
{
    std::ofstream fout("bfs.out");

    std::copy_n(D.begin(), D.size(), std::ostream_iterator<int>(fout, " "));
    fout << '\n';
}