Cod sursa(job #1489768)

Utilizator mike93Indricean Mihai mike93 Data 21 septembrie 2015 23:33:44
Problema BFS - Parcurgere in latime Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 1.83 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct vectorInt {
	int* data;
	int size;
	int capacity;
} vectInt;
typedef vectInt* vector;

vector vec_new(int initCap) {
	if(initCap < 10) {
		initCap = 10;
	}
	vector vect = (vector)malloc(sizeof(vectInt));
	vect->capacity = initCap;
	vect->size = 0;
	vect->data = (int*)malloc(vect->capacity * sizeof(int));
	return vect;
}

void vec_free(vector vect) {
	free(vect->data);
	free(vect);
}

void vec_push_back(vector vect, int val) {
	if(vect->size == vect->capacity) {
		vect->capacity = 2 * vect->capacity;
		int* newData = (int*)malloc(vect->capacity * sizeof(int));
		memcpy(newData, vect->data, vect->size * sizeof(int));
		free(vect->data);
		vect->data = newData;
	}
	vect->data[vect->size] = val;
	vect->size++;
}

int main() {
	FILE* fin = fopen("bfs.in", "r");
	int n, m;
	fscanf(fin, "%d %d\n", &n, &m);
	int i;
	vector* g = (vector*)malloc((n + 1) * sizeof(vector));
	for(i=0; i<=n; i++) {
		g[i] = vec_new(0);
	}
	int x, y;
	int S;
	for(i=0; i<m; i++) {
		fscanf(fin, "%d %d %d\n", &x, &y, &S);
		vec_push_back(g[x], y);
	}
	fclose(fin);
	int* state = (int*)calloc(n + 1, sizeof(int));
	int* d = (int*)malloc((n + 1) * sizeof(int));
	for(i=0; i<=n; i++) {
		d[i] = -1;
	}
	d[S] = 0;
	state[S] = 1;
	int* q = (int*)malloc(n * sizeof(int));
	int last = 1;
	q[0] = S;
	
	int j;
	for(i=0; i<last; i++) {
		x = q[i];
		for(j=0; j<g[x]->size; j++) {
			y = g[x]->data[j];
			if(state[y] == 0) {
				state[y] = 1;
				d[y] = d[x] + 1;
				q[last] = y;
				last++;
			}
		}
	}
	
	FILE* fout = fopen("bfs.out", "w");
	for(i=1; i<=n; i++) {
		fprintf(fout, "%d ", d[i]);
	}
	fprintf(fout, "\n");
	fclose(fout);
	free(state);
	for(i=0; i<=n; i++) {
		free(g[i]);
	}
	free(g);
	free(d);
	free(q);
	return 0;
}