Cod sursa(job #2975624)

Utilizator gabrielinelusGabriel-Robert Inelus gabrielinelus Data 6 februarie 2023 21:59:45
Problema BFS - Parcurgere in latime Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 kb
#include <cstdio>
#include <memory>
#include <vector>
#include <queue>

using namespace std;

class Solver{
private:
  const int INF = 0x3f3f3f3f;
  void BFS(const vector<vector<int>>& Graph, int k, vector<int> &distances) {
    distances.resize((int)Graph.size(), INF);
    queue<int> Q;
    vector<bool> inQ((int)Graph.size());
    
    Q.emplace(k);
    distances[k] = 0;
    inQ[k] = true;
    
    while (!Q.empty()) {
      k = Q.front(); Q.pop();
      for (auto v: Graph[k])
	if (distances[v] > distances[k] + 1) {
	  distances[v] = distances[k] + 1;

	  if (!inQ[v]) {
	    inQ[v] = true;
	    Q.emplace(v);
	  }
	}
    }
  }
public:
  Solver() {
    freopen("bfs.in", "r", stdin);
    freopen("bfs.out", "w", stdout);
  }
  ~Solver() {
    fclose(stdin);
    fclose(stdout);
  }
  
  void execute() {
    int N, M, K;
    vector<vector<int>> Graph;
    int from, to;
    scanf("%d%d%d", &N, &M, &K);
    --K;
    Graph.resize(N);
    for (int i = 0; i < M; ++i) {
      scanf("%d%d", &from, &to);
      --from; --to;
      Graph[from].emplace_back(to);
    }
    vector<int> distances;
    BFS(Graph, K, distances);

    for (auto it: distances)
      if (it >= INF)
	printf("-1 ");
      else
	printf("%d ", it);
  }
};

int main() {
  unique_ptr<Solver> s = make_unique<Solver>();
  s->execute();
  return 0;
}