Cod sursa(job #2606440)

Utilizator RaduNichitaRadu Nichita RaduNichita Data 27 aprilie 2020 19:31:37
Problema BFS - Parcurgere in latime Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.05 kb
#include <iostream>
	
#include <vector>
	
#include <fstream>
#include <queue>
	
using namespace std;
	
 
	
 
	
 
	
#define NMAX 100005
	
 
	
class Task {
	
    std::vector<int> matrix[NMAX];
    std::vector<bool> visited;

	
    int N, M, S;
 
	
    void read_input() {
	
        std::ifstream in("bfs.in");

        in >> N;
        
	
        in >> M;

        in >> S;
	
        for (int i = 0; i < M; i++) {
	
            int x;
	
            int y;
	
            in >> x;
	
            in >> y;
	
            matrix[x].push_back(y);
        }
	
        in.close();
	
    }
	
 
	
    void show_matrix() {
	
        for (int i = 0; i < N; i++) {
	
            std::cout<<i<<":";
	
            for (int j = 0; j < matrix[i].size(); j++) {
	
                std::cout<<matrix[i][j]<<" ";
	
            }
	
            std::cout<<"\n";
	
        }
	
    }
	
 
    std::vector<int> BFS(int source) {
        std::vector<int> distances(N + 1, INT32_MAX);
        distances[source] = 0;

        std::queue<int> queue;
        queue.push(source);

        visited = std::vector<bool> (N + 1, false);

        while (!queue.empty()) {
            auto x = queue.front();
            visited[x] = true;
            queue.pop();
            for (auto const elem: matrix[x]) {
                if (visited[elem] == false) {
                    queue.push(elem);
                    visited[elem] = true;
                    distances[elem] = distances[x] + 1;
                }
            }
        }

        return distances;
    }
	
 
	
    void print(std::vector<int> distances) {
	
        std::ofstream out("bfs.out");   
	

        for (int i = 1; i <= N; i++) {
            if (distances[i] == INT32_MAX) {
                out<<"-1 ";
            } else {
                out<<distances[i]<<" ";
            }
        }

        out<<"\n";
	
        out.close();
	
        return;
	
    }
	
 
	
 public:
	
    void solve() {
	
        read_input();
        print(BFS(S));
	
    }
	
 
	
};
	
 
	
int main() {

    Task* task = new Task();
	
    task->solve();
	
    delete(task);
	
 
	
    return 0;
	
}