Pagini recente » Cod sursa (job #45819) | Cod sursa (job #2947437) | Cod sursa (job #2600433) | Cod sursa (job #2829454) | Cod sursa (job #2196131)
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#define NMAX 100000
#define MMAX 1000000
#define CHUNK (1 << 22)
static struct vlist {
int v;
struct vlist *next;
} *adj_list[NMAX+1], edges[MMAX];
static int dist[NMAX+1], q[NMAX << 2];
static char buf[CHUNK];
static ssize_t blen, bpos = CHUNK;
static inline int read_int(int end)
{
int x = 0, sgn = 1;
while (1) {
if (bpos == CHUNK) {
blen = read(0, buf, CHUNK);
bpos = 0; }
if (buf[bpos] == '-') {
sgn = -1;
} else if ('0' <= buf[bpos] && buf[bpos] <= '9') {
x = x * 10 + (buf[bpos] - '0');
} else if (buf[bpos] == end) {
bpos++;
return sgn * x;
}
bpos++;
}
}
int main(void)
{
int n, m, s, i, u, v, qt, qh;
struct vlist *new_v;
freopen("bfs.in", "r", stdin);
freopen("bfs.out", "w", stdout);
n = read_int(' ');
m = read_int(' ');
s = read_int('\n');
for (i = 0; i < m; i++) {
u = read_int(' ');
v = read_int('\n');
new_v = edges + i;
new_v->v = v;
new_v->next = adj_list[u];
adj_list[u] = new_v;
}
memset(dist, -1, sizeof(dist[0]) * (n + 1));
qt = qh = 0;
q[qt] = s;
dist[s] = 0;
qt++;
while (qh < qt) {
i = q[qh];
qh++;
for (new_v = adj_list[i]; new_v != NULL; new_v = new_v->next) {
if (dist[new_v->v] == -1) {
dist[new_v->v] = dist[i] + 1;
q[qt] = new_v->v;
qt++;
}
}
}
for (i = 1; i <= n; i++) {
printf("%d%c", dist[i], " \n"[i == n]);
}
return 0;
}