Cod sursa(job #2926452)

Utilizator IonescuRalucaIonescu Andreea Raluca IonescuRaluca Data 17 octombrie 2022 19:47:14
Problema BFS - Parcurgere in latime Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.07 kb

#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;

ifstream f("bfs.in");
ofstream g("bfs.out");
int n;
//vector< vector<int> > listaAd;
queue<int> coada;
int prec[100001];
int S;
int noduri,muchii,x,y;
vector< vector<int> > ListaAdiacenta()
{
    vector< vector<int> > listaAd(noduri+1);

    for(int i=0;i<muchii;i++)
    {
        f>>x>>y;
        listaAd[x].push_back(y);
    }
    return listaAd;
}
//void afisareListaAdiacenta(vector<vector<int>> &lista)
//{
//    for(size_t x=1; x< lista.size();x++)
//    {
//        cout<<x<<": ";
//        for(auto y:lista[x])
//            cout<<y<<" , ";
//        cout<<endl;
//    }
//    cout<<endl;
//}


void BFS(vector<vector<int>> &listaAdi,int N,int start)
{
    vector< int > vizitate(N+1,0);
    for(int i=1;i<=N;i++)
        prec[i]=-1;

    vizitate[start] = 1;
    coada.push(start);

    while( !coada.empty() )
    {
        int front = coada.front();
        coada.pop();

        for(int i = 0; i < listaAdi[front].size(); i++)
        {
            int vecin = listaAdi[front][i];
            if( !vizitate[vecin] ) {
                vizitate[ vecin ] = 1;
                prec[vecin]=front;
                coada.push( vecin );
            }
        }
    }
//    for(int i=1;i<=N;i++)
//        cout<<i<<" = "<< prec[i]<<endl;
//    cout << '\n';
    while (!coada.empty())
    {
        coada.pop();
    }
}

int SmallestPath(int start,int final)
{   int nr=0;
    int nod=final;
    while(prec[nod]!=-1 )
    {
        nr++;
        nod=prec[nod];
    }
    if(nod!=start)nr=-1;
    return nr;
}


//void dfs(int start) {
//    cout << start << " ";
//    viz[start] = 1;
//
//    for(int i = 0; i < lists[start].size(); i++) {
//        int vecin = lists[start][i];
//        if( !viz[vecin] ) {
//            dfs(vecin);
//        }
//    }
//}


int main()
{
    f>>noduri>>muchii;
    f>>S;
    auto listaAdiacenta= ListaAdiacenta();
//    afisareListaAdiacenta(listaAdiacenta);

    BFS( listaAdiacenta,noduri,S);
    for(int i=1;i<=noduri;i++)
        g << SmallestPath(S, i) <<" ";

    return 0;
}