Cod sursa(job #2796052)

Utilizator atudoreimirunaAtudorei Miruna Gabriela atudoreimiruna Data 7 noiembrie 2021 14:45:14
Problema BFS - Parcurgere in latime Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.86 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>

#define Nmax 100005

using namespace std;

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

int N, M, S;

class Graf{
private:
    int Nr_Noduri, Nr_Muchii;
    vector<int> matrice_adiacenta[Nmax];
    
public:
    Graf(int N, int M); // constructor
    /*
    vector < vector<int> > getMatriceAdiacenta()
    {
        return matrice_adiacenta;
    }
    */

    void Citire_Graf_Orientat();
    void BFS(int nod_Start);
};

// constructor
Graf :: Graf(int N, int M)
{
    Nr_Noduri = N;
    Nr_Muchii = M;
}

void Graf :: Citire_Graf_Orientat()
{
    for ( int i = 1; i <= Nr_Muchii; i++ )
    {
        int x, y;
        fin >> x >> y;
        matrice_adiacenta[x].push_back(y);
    }
}

void Graf :: BFS(int nod_Start)
{
    bool vizitat[Nmax] = {0};
    queue <int> Q;
    int cost[Nmax] = {0};
    int x;

    // inserez nodul de start in coada vida, iar acesta va avea costul 0
    // cost[nod_Start] = 0;
    vizitat[nod_Start] = 1;
    Q.push(nod_Start);

    while ( !Q.empty() )
    {
        // la fiecare pas luam nodul din inceputul cozii, dupa care il vom elimina
        x = Q.front();
        Q.pop();

        for ( int i = 0; i < matrice_adiacenta[x].size(); i++ )
            if ( vizitat[matrice_adiacenta[x][i]] == 0 )
            {
                Q.push(matrice_adiacenta[x][i]);
                // costul unui nod nou adaugat va fi costul nodului care l-a adaugat + 1.
                cost[matrice_adiacenta[x][i]] = cost[x] + 1;
                vizitat[matrice_adiacenta[x][i]] = 1;
            }
    }
    // afisare costuri
    for ( int i = 1; i <= Nr_Noduri; i++ )
        if ( vizitat[i] != 0 )
            fout << cost[i] << " ";
        else 
            fout << -1 << " ";
}

int main()
{
    fin >> N >> M >> S;

    Graf G(N, M);
    G.Citire_Graf_Orientat();

    G.BFS(S);

    return 0;
}