Cod sursa(job #2953322)

Utilizator Cris.CristinaPopescu Cristina Cris.Cristina Data 10 decembrie 2022 23:17:42
Problema BFS - Parcurgere in latime Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.86 kb
#include<iostream>
#include <bits/stdc++.h>
#include<fstream>
#include<vector>
#include<queue>

using namespace std;

const int N = 1e5 + 5;
ifstream f("bfs.in");
ofstream g("bfs.out");
vector<int> graph[N]; // graful
int dist[N]; // distanta fata de nodul sursa
bool visited[N]; // daca un nod a fost vizitat

// functie care parcurge graful in latime
void bfs(int start) {
    // initializam distanta pentru nodul sursa cu 0
    dist[start] = 0;
    // adaugam nodul sursa in coada
    queue<int> q;
    q.push(start);

    // cat timp avem noduri in coada
    while (!q.empty()) {
        // extragem primul nod din coada
        int curr = q.front();
        q.pop();

        // daca nodul curent a fost deja vizitat, trecem la urmatorul
        if (visited[curr]) continue;

        // marcam nodul curent ca vizitat
        visited[curr] = true;

        // parcurgem toti vecinii nodului curent
        for (int i = 0; i < graph[curr].size(); i++) {
            int next = graph[curr][i];

            // daca nodul vecin nu a fost vizitat, il adaugam in coada
            if (!visited[next]) {
                q.push(next);

                // actualizam distanta fata de nodul sursa pentru nodul vecin
                dist[next] = dist[curr] + 1;
            }
        }
    }
}

int main() {
    // citim numarul de noduri, numarul de arce si nodul sursa
    int n, m, s;
    f >> n >> m >> s;
    // citim arcele din graf
    while (m--) {
        int x, y;
        f >> x >> y;

        // adaugam o muchie de la x la y in graf
        graph[x].push_back(y);
    }

    // parcurgem graful in latime
    bfs(s);

    // afisam distanta fata de nodul sursa pentru fiecare nod din graf
    for (int i = 1; i <= n; i++) {
        if (visited[i]) g << dist[i] << " ";
        else g << -1 << " ";
    }

    return 0;
}