Cod sursa(job #3149269)

Utilizator Sebi_RipaSebastian Ripa Sebi_Ripa Data 6 septembrie 2023 21:43:24
Problema BFS - Parcurgere in latime Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.49 kb
#include <bits/stdc++.h>
#define cin fin
#define cout fout

using namespace std;

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

int vf[100001], ans;
bool ok = false;
map <int, vector<int>> adj;
queue <int> nxt;
queue <int> nxt2;

class graph {
public:
    void addEdge(int x, int y) {
        adj[x].push_back(y);
    }
    void bfs(int st, int src);
};

void graph::bfs(int st, int src) {
    if(!nxt.empty())
        nxt.pop();
    vf[st] = 1;
    for(auto x : adj[st]) {
        if(!vf[x])
            nxt2.push(x);
        if(x == src) {
            ok = true;
            vf[st] = 0;
            return;
        }
    }
    if(ok) {
        vf[st] = 0;
        return;
    }
    if(nxt.empty()) {
        ans++;
        swap(nxt, nxt2);
    }
    if(nxt.empty())
        return;
    bfs(nxt.front(), src);
    vf[st] = 0;
}

int main()
{
    int n, m, s, x, y;
    graph g;
    cin >> n >> m >> s;
    for(int i = 1; i <= m; i++) {
        cin >> x >> y;
        g.addEdge(x, y);
    }
    for(int i = 1; i <= n; i++) {
        ans = 0;
        ok = false;
        if(s != i)
            g.bfs(s, i);
        while(!nxt.empty() || !nxt2.empty()) {
            if(!nxt.empty())
                nxt.pop();
            if(!nxt2.empty())
                nxt2.pop();
        }
        if(ok)
            cout << ans+1 << ' ';
        else if(s == i)
            cout << "0 ";
        else
            cout << -1 << ' ';
    }
    return 0;
}