Cod sursa(job #1995494)

Utilizator xtreme77Patrick Sava xtreme77 Data 28 iunie 2017 02:29:43
Problema BFS - Parcurgere in latime Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 2.14 kb
#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;
}