Pagini recente » Cod sursa (job #756929) | Cod sursa (job #1314629) | Cod sursa (job #1981877) | Cod sursa (job #462666) | Cod sursa (job #463085)
Cod sursa(job #463085)
// http://infoarena.ro/problema/bfs
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
typedef struct node {
int b;
struct node *next;
} Node;
Node **Next;
int n, m, s;
int *Dist;
void breadthFirst(int here) {
char *Used = (char*)calloc(n, sizeof(char));
Dist = (int*)calloc(n, sizeof(int));
int i;
for (i = 0; i < n; ++ i)
Dist[i] = INT_MAX;
Dist[here] = 0;
Node *begin, *end = (Node*)calloc(1, sizeof(Node)),
*helper, *curr;
end->b = here;
Used[here] = 1;
Dist[here] = 0;
for (begin = end; begin != NULL; begin = helper) {
here = begin->b;
for (curr = Next[here]; curr != NULL; curr = curr->next) {
if (!Used[curr->b]) {
Dist[curr->b] = Dist[here] + 1;
Used[curr->b] = 1;
helper = (Node*)calloc(1, sizeof(Node));
helper->b = curr->b;
helper->next = end->next;
end->next = helper;
end = helper;
}
}
helper = begin->next;
free(begin);
}
free(Used);
}
void addEdge(int a, int b) {
Node *helper = (Node*)calloc(1, sizeof(Node));
helper->b = b;
helper->next = Next[a];
Next[a] = helper;
}
int main() {
freopen("bfs.in", "r", stdin);
freopen("bfs.out", "w", stdout);
scanf("%d%d%d", &n, &m, &s);
Next = (Node**)calloc(n, sizeof(Node*));
int i, a, b;
for (i = 0; i < m; ++ i) {
scanf("%d%d", &a, &b);
addEdge(a - 1, b - 1);
}
breadthFirst(s - 1);
for (i = 0; i < n; ++ i)
printf("%d ", (Dist[i] == INT_MAX) ? -1 : Dist[i]);
free(Dist);
Node *curr, *helper;
for (i = 0; i < n; ++ i)
for (curr = Next[i]; curr != NULL; curr = helper) {
helper = curr->next;
free(curr);
}
free(Next);
return 0;
}