Cod sursa(job #2223871)

Utilizator a_h1926Heidelbacher Andrei a_h1926 Data 21 iulie 2018 21:27:29
Problema BFS - Parcurgere in latime Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include <fstream>
#include <vector>
#include <string>
#include <queue>
#include <algorithm>
#include <tuple>

using namespace std;

typedef vector<vector<int>> Graph;

const string IN_FILE = "bfs.in";
const string OUT_FILE = "bfs.out";

vector<int> bfs(const Graph& graph, const int source) {
    auto distances = vector<int>(int(graph.size()), -1);
    distances[source] = 0;
    queue<int> q;
    for (q.push(source); !q.empty(); q.pop()) {
        const int u = q.front();
        for (const auto& v : graph[u]) {
            if (distances[v] == -1) {
                distances[v] = distances[u] + 1;
                q.push(v);
            }
        }
    }
    return distances;
}

pair<Graph, int> readInput() {
    ifstream in(IN_FILE);
    int V, E, S;
    in >> V >> E >> S;
    auto graph = Graph(V);
    for (int i = 0; i < E; i++) {
        int u, v;
        in >> u >> v;
        graph[u - 1].push_back(v - 1);
    }
    return make_pair(graph, S - 1);
}

void writeOutput(const vector<int>& distances) {
    ofstream out(OUT_FILE);
    for (int u = 0; u < int(distances.size()); u++) {
        out << distances[u] << (u + 1 < int(distances.size()) ? " " : "\n");
    }
    out.close();
}

int main() {
    Graph graph;
    int source;
    tie(graph, source) = readInput();
    const auto distances = bfs(graph, source);
    writeOutput(distances);
    return 0;
}