Cod sursa(job #2907985)

Utilizator lolotbogdanLolot Stefan-Bogdan lolotbogdan Data 1 iunie 2022 00:04:11
Problema BFS - Parcurgere in latime Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.62 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>

using namespace std;

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

int n, m; // numarul de noduri, respectiv de muchii
int s;
vector<vector<int>>vecini; // liste de adiacenta
vector<bool>vizitat; // marcarea nodurilor vizitate
vector<int>distante;
queue<int>coada;

void bfs(int nod){

    // marchez nodul din care incep parcurgerea ca fiind fizitat
    vizitat[nod] = 1;

    // il adaug in coada, pentru a-i vizita ulterior vecinii
    coada.push(nod);

    // cat timp mai am in coada noduri pentru care trebuie sa le vizitez vecinii
    while(!coada.empty()){

        int u = coada.back();

        coada.pop();

        for(int i = 0; i < vecini[u].size(); i++){

            // am gasit un vecin nevizitat
            if(!vizitat[vecini[u][i]]){

                // il vizitez si il adaug in coada
                vizitat[vecini[u][i]] = 1;
                coada.push(vecini[u][i]);

                // distanta pana la nodul nou adaugat in coada = distanta pana la nodul care l-a adaugat + 1
                distante[vecini[u][i]] = distante[u] + 1;
            }
        }
    }

    for(int i = 1; i <= n; i++)
        if(i!= s && distante[i] == 0)
            g << "-1 ";
        else
            g << distante[i] << " ";
}

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

    vecini.resize(n + 1);
    vizitat.resize(n + 1, 0);
    distante.resize(n + 1, 0);

    for(int i = 0; i < m; i++){

        int x, y;

        f >> x >> y;

        vecini[x].push_back(y);
    }

    bfs(s);

    return 0;
}