Cod sursa(job #2780165)

Utilizator Teo_1101Mititelu Teodor Teo_1101 Data 6 octombrie 2021 11:07:09
Problema BFS - Parcurgere in latime Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.6 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>

using namespace std;

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

const int NMAX = 100001;

class graf{
    vector < int > Ad[NMAX];
    int N;
public:
    graf(int n):N(n){}
    void addEdge(int x, int y){
        Ad[x].push_back( y );
    }
    void DFS( int nod, bool vis[] ){
        vis[nod] = 1;
        for( int i = 0; i < Ad[nod].size(); ++i ){
            int w = Ad[nod][i];
            if( vis[w] == 0 )DFS(w,vis);
        }
    }
    void BFS( int nod ){
        queue < int > Q;

        int dist[NMAX] = {0};
        Q.push(nod);
        int x;

        while( !Q.empty() ){
            x = Q.front();
            Q.pop();

            for( int i = 0; i < Ad[x].size(); ++i ){
                int w = Ad[x][i];

                if( dist[w] == 0 && w != x && w != nod ){
                    dist[w] = dist[x] + 1;
                    Q.push(w);
                }
            }
        }

        for( int i = 1; i <= N; ++i )
            if( dist[i] != 0 || i == nod )fout << dist[i] << ' ';
            else fout << "-1 ";
    }
    int nrComponenteConexe(){
        int nr = 0;
        bool vis[NMAX] = {0};
        for( int i = 1; i <= N; ++i )
            if( vis[i] == 0 ){
                DFS(i,vis);
                nr++;
            }
        return nr;
    }

};

int main()
{
    int N, M, S, x, y;
    fin  >> N >> M >> S;

    graf G(N);
    for( int i = 1; i <= M; ++i ){
        fin >> x >> y;
        G.addEdge(x,y);
    }
    G.BFS(S);

    return 0;
}