Pagini recente » Statistici Grama David Sebastian (GramaDavid) | Monitorul de evaluare | Cod sursa (job #1766052) | Monitorul de evaluare | Cod sursa (job #2053764)
#pragma GCC optimize("Ofast")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#include <iostream>
#include <cstring>
#include <fstream>
#include <cctype>
using namespace std;
constexpr int kMaxN = 100000, kMaxM = 1000000;
constexpr int kBuffSize = (1 << 12);
int offset[kMaxN + 1], vertex[kMaxM];
pair<int, int> edge[kMaxM];
int dist[kMaxN], bfq[kMaxN];
inline char GetChar() {
static char buff[kBuffSize];
static int pointer = kBuffSize;
if (__builtin_expect(pointer == kBuffSize, false)) {
fread(buff, 1, kBuffSize, stdin);
pointer = 0;
}
return buff[pointer++];
}
inline int ReadInt() {
char c;
do { c = GetChar(); } while (not isdigit(c));
int number = 0;
do {
number = (number << 1) + (number << 3) + (c - '0');
c = GetChar();
} while (isdigit(c));
return number;
}
int main() {
#ifdef INFOARENA
freopen("bfs.in", "r", stdin);
freopen("bfs.out", "w", stdout);
#endif
int n = ReadInt(), m = ReadInt(), s = ReadInt() - 1;
for (int i = 0; i < m; i += 1) {
int x = ReadInt() - 1, y = ReadInt() - 1;
offset[x] += 1;
edge[i] = make_pair(x, y);
}
for (int i = 1; i <= n; i += 1) {
offset[i] += offset[i - 1];
}
for (int i = 0; i < m; i += 1) {
vertex[--offset[edge[i].first]] = edge[i].second;
}
int q_start = 0, q_end = 1;
dist[s] = 1;
bfq[0] = s;
while (q_start != q_end) {
const int node = bfq[q_start++];
for (int i = offset[node]; i != offset[node + 1]; i += 1) {
const int son = vertex[i];
if (dist[son] == 0) {
dist[son] = dist[node] + 1;
bfq[q_end++] = son;
}
}
}
for (int i = 0; i < n; i += 1) {
printf("%d ", dist[i] - 1);
}
}