Cod sursa(job #3245071)

Utilizator dragoncrackCandidatu Mario Luca dragoncrack Data 27 septembrie 2024 11:20:11
Problema BFS - Parcurgere in latime Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.65 kb
#include <fstream>
#include <vector>
#include <algorithm>
#include <queue>
#define INF 2e9

using namespace std;

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

vector<int> neighbours[100005];
int dist[100005];
int n, m, s;

bool connected(int x, int y){
    int st = 0;
    int dr = neighbours[x].size() - 1;
    while(st <= dr){
        int mid = (st + dr) / 2;
        if(y == neighbours[x][mid]) return true;
        else if(y < neighbours[x][mid]) dr = mid - 1;
        else if(y > neighbours[x][mid]) st = mid + 1;
    }
    return false;
}

void solve(){
    queue<pair<int, int>> Q;
    for(int i = 0; i < neighbours[s].size(); i++){
        Q.push(make_pair(neighbours[s][i], 1));
    }
    while(!Q.empty()){
        pair<int, int> current = Q.front();
        if(dist[current.first] > current.second){
            dist[current.first] = current.second;
            for(int i = 0; i < neighbours[current.first].size(); i++){
                if(dist[neighbours[current.first][i]] > current.second + 1){
                    Q.push(make_pair(neighbours[current.first][i], current.second + 1));
                }
            }
        }
        Q.pop();
    }
}

int main()
{
    fin >> n >> m >> s;
    for(int i = 1; i <= m; i++){
        int x, y;
        fin >> x >> y;
        neighbours[x].push_back(y);
    }
    for(int i = 1; i <= n; i++){
        if(i != s){
            dist[i] = INF;
        }
        sort(neighbours[i].begin(), neighbours[i].end());
    }
    solve();
    for(int i = 1; i <= n; i++){
        if(dist[i] == INF) fout << -1;
        else fout << dist[i];
        fout << " ";
    }
}