Pagini recente » Cod sursa (job #3136770) | Cod sursa (job #848672) | Cod sursa (job #58419) | Cod sursa (job #2144677) | Cod sursa (job #1995494)
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
typedef struct List {
struct List *urm ;
int node ;
};
struct List **begin, **end;
struct List *queuebegin, *queueend ;
void init_graph (int n) {
begin = malloc (sizeof(struct List *) * (n + 1)) ;
end = malloc(sizeof(struct List *) * (n + 1)) ;
for (int i = 0 ; i <= n ; ++ i) {
end [i] = begin [i] = NULL ;
}
}
void init_queue () {
queuebegin = NULL ;
queueend = NULL ;
}
void insert (struct List **b, struct List **e, int y) {
if (*b == NULL) {
struct List *temp = (struct List *) malloc (sizeof(struct List *)) ;
*b = temp ;
*e = temp ;
(*b) -> urm = NULL ;
(*b) -> node = y ;
return ;
}
else {
struct List *temp = (struct List *) malloc (sizeof(struct List *)) ;
(*e) -> urm = temp ;
*e = temp ;
(*e) -> node = y ;
(*e) -> urm = NULL ;
}
}
void add_edge (int x, int y) {
insert (&begin[x], &end[x], y) ;
}
void push_queue (int node) {
insert (&queuebegin, &queueend, node) ;
}
char isempty_queue () {
if (queuebegin == NULL) return 1 ;
return 0 ;
}
void pop_queue () {
struct List *cur = queuebegin ;
queuebegin = queuebegin -> urm ;
free (cur) ;
}
int front_queue () {
return queuebegin -> node ;
}
int main(int argc, char const *argv[])
{
freopen ("bfs.in", "r", stdin) ;
freopen ("bfs.out", "w", stdout) ;
int n, m, source, x, y, node ;
scanf ("%d %d %d", &n, &m, &source) ;
init_graph (n) ;
while (m --) {
scanf ("%d %d", &x, &y) ;
assert (x >= 1 && x <= n) ;
assert (y >= 1 && y <= n) ;
add_edge (x, y) ;
}
init_queue() ;
push_queue (source) ;
int *dist = malloc(sizeof(int) * (n + 1)) ;
for (int i = 1 ; i <= n ; ++ i) {
dist [i] = 1 << 29 ;
}
dist [source] = 0 ;
struct List *cur ;
while (isempty_queue() == 0) {
node = front_queue() ;
pop_queue() ;
cur = begin[node] ;
while (cur != NULL) {
if (dist [cur -> node] > dist [node] + 1) {
dist [cur -> node] = dist [node] + 1 ;
push_queue (cur -> node) ;
}
cur = cur -> urm ;
}
}
for (int i = 1 ; i <= n ; ++ i) {
if (dist [i] != (1 << 29)) {
printf ("%d ", dist [i]) ;
}
else {
printf("-1 ");
}
}
return 0;
}