Cod sursa(job #2017745)

Utilizator medicinedoctoralexandru medicinedoctor Data 2 septembrie 2017 13:12:51
Problema BFS - Parcurgere in latime Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

vector <vector <int> > graph;
vector <int> distances;
int start;

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

void read() {
    unsigned long long nodes, edges;
    in >> nodes >> edges >> start;
    graph.resize(nodes + 1);

    for (int pairIndex = 0; pairIndex < edges; pairIndex++) {
        int left, right;
        in >> left >> right;
        if (left == right) {
            continue;
        }

        bool rightIsUnique = find(
            graph[left].begin(), graph[left].end(), right
        ) == graph[left].end();
        if (rightIsUnique) {
            graph[left].push_back(right);
        }
    }
}

void initDistances() {
    distances.resize(graph.size());
    fill(distances.begin(), distances.end(), -1);
    distances[start] = 0;
}

void shortestWay() {
    vector<int> queue;
    queue.push_back(start);

    for (int index = 0; index < queue.size(); index++) {
        int node = queue[index], neighborIndex = 0;
        for (; neighborIndex < graph[node].size(); neighborIndex++) {
            int neighbor = graph[node][neighborIndex];
            if (distances[neighbor] != -1) {
                continue;
            } else {
                distances[neighbor] = distances[node] + 1;
                queue.push_back(neighbor);
            }
        }
    }
}

void write() {
    for (int index = 1; index < distances.size(); index++) {
        out << distances[index] << ' ';
    }
}

int main() {
    read();
    initDistances();
    shortestWay();
    write();

    return 0;
}