Cod sursa(job #2787082)

Utilizator RoberttoPopescu Paullo Robertto Karloss Robertto Data 22 octombrie 2021 14:15:46
Problema BFS - Parcurgere in latime Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.4 kb
#include <bits/stdc++.h>

const int maxi=100001;
using namespace std;

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

class Graf
{
    int nrNoduri, nrMuchii;
    int vizitat2[100001], coada[100001];
    int pozitiePlecare, pozitieUltima;
    vector<int> adiacenta[maxi];
//    int **matriceAdiacenta;
public:
    Graf();

    void BFS(int nodPlecare);

    void DFS(int nodPlecare);

    void citire2(int &nodPlecare);

    void BFS2(int nodPlecare);

    void afisareCoada2();

    void citire();

    void afisare();

    void afisareCoada();

    ~Graf();
};

// neorientat
Graf::Graf()
{
//    matriceAdiacenta = new int *[nrNoduri];  /// tabloul pointerilor de linii
//    for (int i = 0; i < nrNoduri; i++)
//        matriceAdiacenta[i] = new int[nrNoduri]; /// tabloul valorilor din linie
    for (int i = 1; i <= maxi; i++)
        vizitat2[i] = -1;
    pozitiePlecare = pozitieUltima = 1;
//    coada[1] = 2;
//    vizitat[2] = 1;
}

Graf::~Graf()
{
//    for (int i = 0; i < nrNoduri; i++)
//        delete[] matriceAdiacenta[i];
//    delete[] matriceAdiacenta;
}



void Graf::citire2(int &nodPlecare)
{
    int x, y;
    fin >> nrNoduri >> nrMuchii >> nodPlecare;
    for (int i = 1; i <= nrMuchii; i++)
    {
        fin >> x >> y;
        adiacenta[x].push_back(y);
        //adiacenta[y].push_back(x);
    }
    coada[1] = nodPlecare;
    vizitat2[coada[1]] = 1;
}

void Graf::BFS2(int pozitiePlecare)
{
    int nodPlecare = coada[pozitiePlecare]; // retin nodul de unde plec
    for (int j = 0; j < adiacenta[nodPlecare].size(); j++)
        if (vizitat2[adiacenta[nodPlecare][j]] == -1)
        {
            // caut toate nodurile nevizitate care sunt adiacente cu nodul de plecare
            vizitat2[adiacenta[nodPlecare][j]] = vizitat2[nodPlecare] + 1; // il marcam vizitat
            pozitieUltima++; // indexez pozitia ultimului element din coada
            coada[pozitieUltima] = adiacenta[nodPlecare][j]; // il adaug in coada PUSH
        }
    if (pozitiePlecare < pozitieUltima) // daca mai sunt elemente in coada / nu am verificat pt toate nodurile
        BFS2(pozitiePlecare + 1);
}

void Graf::afisareCoada2()
{
    for (int i = 1; i <= nrNoduri; i++)
    {
        if (vizitat2[i] != -1)
            fout << vizitat2[i] - 1 << " ";
        else
            fout << -1 << " ";
    }
}

int main()
{

    int nodPlecare;
    Graf g1;

    g1.citire2(nodPlecare);
    g1.BFS2(1);
    g1.afisareCoada2();
    return 0;
}