Cod sursa(job #463085)

Utilizator plastikDan George Filimon plastik Data 14 iunie 2010 15:36:59
Problema BFS - Parcurgere in latime Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.58 kb
// 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;
}