Cod sursa(job #2784764)

Utilizator StarkillerCalin Stafie Starkiller Data 17 octombrie 2021 12:38:09
Problema BFS - Parcurgere in latime Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.6 kb
#include <bits/stdc++.h>

using namespace std;

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

class Graful_meu
{
    int _noduri;
    int _muchii;
    vector<vector<int>> lista_muchii;
    //bool noduri_vizitate[NMAX]; -- in fiecare metoda care are nevoie de el (NU AICI)

public:
    Graful_meu();   // daca ni se da lista de adiacenta
    int Componente_conexe();
    void citire_muchii_neorientat();
    int citire_muchii_orientat_cu_nod_start();
    void DFS(int start, bool vizitat[]);
    void BFS(int start);
};
Graful_meu::Graful_meu()
{
    _noduri = 0;
    _muchii = 0;
}
void Graful_meu::citire_muchii_neorientat()
{
    int x, y;
    fin >> _noduri;
    fin >> _muchii;
    lista_muchii.resize(_noduri+2);
    for(int i = 1 ; i <= _muchii ; ++i)
    {
        fin >> x >> y;
        lista_muchii[x].push_back(y);
        lista_muchii[y].push_back(x);
    }
}
int Graful_meu::citire_muchii_orientat_cu_nod_start()
{
    int x, y, nod_start;
    fin >> _noduri;
    fin >> _muchii;
    fin >> nod_start;
    lista_muchii.resize(_noduri+2);
    for(int i = 1 ; i <= _muchii ; ++i)
    {
        fin >> x >> y;
        lista_muchii[x].push_back(y);
    }
    return nod_start;
}
void Graful_meu::DFS(int start, bool vizitat[])
{
    vizitat[start] = 1;
    for(int nod_vecin : lista_muchii[start])
        if(vizitat[nod_vecin] == 0)
            DFS(nod_vecin, vizitat);

}
int Graful_meu::Componente_conexe()
{
    bool vizitat[_noduri + 2] = {0};
    int numar_componente_conexe = 0;
    for(int i = 1 ; i <= _noduri ; ++i)
        if (vizitat[i] == 0)
        {
            DFS(i, vizitat);
            ++numar_componente_conexe;
        }
    return numar_componente_conexe;
}

void Graful_meu::BFS(int start)
{
    bool vizitat[_noduri + 2] = {0};
    queue<int>coada_BFS;
    vector<int> drumuri_minime(_noduri + 2, -1);

    coada_BFS.push(start);
    vizitat[start] = 1;
    drumuri_minime[start] = 0;

    while(!coada_BFS.empty())
    {

        for(int nod_vecin : lista_muchii[start])
            if(vizitat[nod_vecin] == 0)
            {
                coada_BFS.push(nod_vecin);
                vizitat[nod_vecin] = 1;
                drumuri_minime[nod_vecin] = drumuri_minime[start] + 1;
            }
        coada_BFS.pop();
        start = coada_BFS.front();
    }

    for(int i = 1 ; i <= _noduri ; ++i)
        gout << drumuri_minime[i] << " ";
}
int main()
{
    Graful_meu g;
    int nod_start = g.citire_muchii_orientat_cu_nod_start();
    //gout << g.Componente_conexe();
    g.BFS(nod_start);
    return 0;
}