Cod sursa(job #2656085)

Utilizator UtilizatorGBGeorge Bodea UtilizatorGB Data 6 octombrie 2020 18:32:24
Problema BFS - Parcurgere in latime Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.95 kb
#include <iostream>
#include <fstream>
#include <tuple>
#include <vector>
#include <queue>
#include <set>

using namespace std;

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

queue<int> deViz;
set<int> elemViz;

void parcurgereBFS(vector<int> *listaDeArce, int distPunctAles[], int &distanta) {
    // Retin valoarea ultimului element al cozii . Cand intalmim aceea valoare la inceput marim distanta, iar atunci retinem valoarea
    int deCres = deViz.back();

    while (deViz.empty() == 0) {
        // Luam primul element din coada
        int prElem = deViz.front();

        // Verificam daca este in set-ul de elemente parcurse
        if (elemViz.find(prElem) == elemViz.end()) {
            elemViz.insert(prElem);
            distPunctAles[prElem] = distanta;

            // Iteram prin vectorul de arce al nodului respectiv si le puncem in coada daca nu au fost vizitate
            for (int i = 0; i < listaDeArce[prElem].size(); i++) {
                int elemVecin = listaDeArce[prElem][i];
                if (elemViz.find(elemVecin) == elemViz.end())
                    deViz.push(listaDeArce[prElem][i]);
            }
        }

        if (deCres == prElem) {
            distanta++;
            deCres = deViz.back();
        }
        deViz.pop();
    }
}

int main() {
    int n, m, s;
    f >> n >> m >> s;

    // Trebuie sa facem o lista de arce per nod: 1: 2,3
    vector<int> listaDeArce [n+1];
    int distPctAles[n+1];
    for (int i = 1; i<= n; i++)
        distPctAles[i] = -1;

    for (int i = 1; i <= n; i++) {
        vector<int> temp;
        listaDeArce[i] = temp;
    }

    for (int i = 0; i < m; i++) {
        int source, destination;
        f>>source;
        f>>destination;
        listaDeArce[source].emplace_back(destination);
    }

    deViz.push(s);
    int distanta = 0;

    parcurgereBFS(listaDeArce, distPctAles, distanta);

    for (int i = 1; i <= n; i++)
        g<<distPctAles[i]<<' ';

    f.close();
    g.close();
    return 0;
}