Pagini recente » Cod sursa (job #1986905) | Cod sursa (job #2091078) | Cod sursa (job #2342164) | Cod sursa (job #649522) | Cod sursa (job #565400)
Cod sursa(job #565400)
#include <stdio.h>
#include <stdlib.h>
#define NMax 1000001
#define infinity 10000
#define INFILE "bfs.in"
#define OUTFILE "bfs.out"
enum colours {WHITE, GRAY, BLACK};
int Q[NMax], head = 1, tail = 1, length = NMax-1;
int *A[NMax];
int color[NMax], d[NMax], pi[NMax], v[NMax];
int n, s;
void enqueue(int x)
{
Q[tail] = x;
if (tail == length)
tail = 1;
else tail++;
}
void dequeue()
{
if (head == length)
head = 1;
else head++;
}
void BFS(int s)
{
int i, u, x, count;
for (i=1; i<=n; ++i){
color[n] = WHITE;
d[n] = infinity;
pi[n] = 0;
}
v[s] = 0;
color[s] = GRAY;
d[s] = 0;
pi[s] = 0;
enqueue(s);
while (head < tail) {
u = Q[head];
count = v[u]+1;
for (i=1; i<=A[u][0]; ++i)
if (color[A[u][i]] == WHITE) {
v[A[u][i]] = count;
color[A[u][i]] = GRAY;
d[A[u][i]] = d[u] + 1;
pi[A[u][i]] = u;
enqueue(A[u][i]);
}
dequeue();
color[u] = BLACK;
}
}
void read()
{
int x, y, m, i;
scanf("%d %d %d", &n, &m, &s);
for (i=1; i<=n; ++i) {
A[i] = (int*)malloc(sizeof(int));
A[i][0] = 0;
}
for (i=0; i<m; ++i) {
scanf("%d %d", &x, &y);
++A[x][0];
A[x] = (int*)realloc(A[x], (A[x][0]+1)*sizeof(int));
A[x][A[x][0]] = y;
}
}
int main()
{
freopen(INFILE, "r", stdin);
freopen(OUTFILE, "w", stdout);
read();
int i;
for (i=1; i<=n; ++i)
v[i] = -1;
BFS(s);
for (i=1; i<=n; ++i)
printf("%d ", v[i]);
return 0;
}