Cod sursa(job #788890)

Utilizator ibicecIT Zilla ibicec Data 16 septembrie 2012 01:00:07
Problema BFS - Parcurgere in latime Scor 80
Compilator c Status done
Runda Arhiva educationala Marime 2.33 kb
#include <stdio.h>
#include <stdlib.h>

struct queue_node {
	int v;
	struct queue_node *next;
};

inline void enqueue(struct queue_node **frt, struct queue_node **bck, int value) {
	struct queue_node *back = *bck;

	if ( back == NULL ) {
		back = (struct queue_node*) malloc( sizeof(struct queue_node) );
		*frt = back;
	} else {
		back->next = (struct queue_node*) malloc( sizeof(struct queue_node) );
		back = back->next;
	}
	
	back->v = value;
	back->next = NULL;
	
	*bck = back;
}

inline int dequeue(struct queue_node **frt, struct queue_node **bck) {
	struct queue_node *front = *frt;

	if ( front == NULL ) {
		return -1;
	}

	struct queue_node *tmp = front;
	int value = front->v;
	front = front->next;
	free(tmp);
	
	*frt = front;
	if ( front == NULL ) {
		*bck = NULL;
	}
	
	return value;
}

int main() {

	int n, m, s;

	freopen("bfs.in", "r", stdin);
	freopen("bfs.out", "w", stdout);
	
	scanf("%d%d%d", &n, &m, &s);

	int *num_edges = (int*) calloc(n, sizeof(int)); // number of edges for every vertex
	int **matrix = (int**) malloc(n * sizeof(int*)); // adjacency matrix
	int *dist = (int*) malloc(n * sizeof(int)); // distance from s to each vertex
	
	fpos_t file_pos;
	fgetpos(stdin, &file_pos);
	
	// finding the number of edges to each vertex
	int i, u, v;
	for (i=0; i<m; i++) {
		scanf("%d%d", &u, &v);
		num_edges[u-1]++;
	}
	
	// allocating necessary memory for the adjacency matrix
	for (i=0; i<n; i++) {
		matrix[i] = (int*) malloc( num_edges[i]*sizeof(int) );
	}

	fsetpos(stdin, &file_pos);
	
	// filling the adjacency matrix
	int *tmp_num_edges = (int*) calloc(n, sizeof(int));
	for (i=0; i<m; i++) {
		scanf("%d%d", &u, &v);
		matrix[u-1][ tmp_num_edges[u-1]++ ] = v-1;
	}
	free(tmp_num_edges);
	
	// initializing distance attributes
	for (i=0; i<n; i++) {
		dist[i] = -1;
	}
	
	struct queue_node *front = NULL, *back = NULL;
	
	enqueue(&front, &back, s-1);
	dist[s-1] = 0;  // distance from s to s is 0

	// breadth first search
	int t; // temporary vertex
	while ( front != NULL ) {
		t = dequeue(&front, &back);
		for ( i=0; i<num_edges[t]; i++ ) {
			if ( dist[ matrix[t][i] ] == -1 ) {
				dist[ matrix[t][i] ] = dist[t]+1;
				enqueue( &front, &back, matrix[t][i] );
			}
		}
	}

	for (i=0; i<n; i++) {
		printf("%d ", dist[i]);
	}

	return 0;
}