Pagini recente » Cod sursa (job #504607) | Cod sursa (job #2597830) | Cod sursa (job #2604311) | Cod sursa (job #2604001) | Cod sursa (job #1523493)
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#define NMAX 100000
struct llist {
unsigned v, d;
struct llist *next;
};
static struct llist *ADJ[NMAX + 1], *Q[NMAX + 1];
static int D[NMAX + 1];
static unsigned head, tail;
static struct llist *make_node(unsigned u)
{
struct llist *nod = malloc(sizeof(struct llist));
nod->v = u;
nod->d = INT_MAX;
return nod;
}
static void insert_edge(unsigned u, struct llist *nod)
{
nod->next = ADJ[u];
ADJ[u] = nod;
}
static void bfs(unsigned s)
{
struct llist *src = make_node(s);
struct llist *u, *v;
src->d = D[s] = 0;
Q[tail++] = src;
while (head != tail) {
u = Q[head++];
for (v = ADJ[u->v]; v; v = v->next)
if (D[v->v] == -1) {
D[v->v] = D[u->v] + 1;
Q[tail++] = v;
}
}
}
int main(void)
{
unsigned m, n, s, i, u, v;
struct llist *nod;
freopen("bfs.in", "r", stdin);
freopen("bfs.out", "w", stdout);
for (i = 1; i <= NMAX; i++)
D[i] = -1;
scanf("%u %u %u", &n, &m, &s);
for (i = 0; i < m; i++) {
scanf("%u %u", &u, &v);
nod = make_node(v);
insert_edge(u, nod);
}
bfs(s);
for (i = 1; i <= n; i++)
printf("%d ", D[i]);
printf("\n");
return 0;
}