Pagini recente » Cod sursa (job #2534019) | Cod sursa (job #2083377) | Cod sursa (job #864416) | Cod sursa (job #96448) | Cod sursa (job #2975624)
#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;
}