Cod sursa(job #877631)

Utilizator PirvuMihaiPirvu Mihai PirvuMihai Data 13 februarie 2013 00:07:53
Problema BFS - Parcurgere in latime Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 1.09 kb
#include <stdio.h>
#include <stdlib.h>

void Enqueue(int q[], int *l, int x, int dist[], int tata)
{
	q[*l]=x;
	dist[x]=dist[tata]+1;
	*l=*l+1;
}

void Afara(FILE* g, int q[], int *l, int sol[])
{
	sol[q[0]]=1;
	int i;
	*l=*l-1;
	for(i=0;i<*l;i++)
		q[i]=q[i+1];
}

int NuEInCoada(int q[], int l, int x)
{
	int i;
	for(i=0;i<l;i++)
		if(q[i]==x)
			return 0;
	return 1;
}

int main ()
{
	FILE *f=fopen("bfs.in", "rt"), *g=fopen("bfs.out", "wt");
	int v[100000][100000]={{0}}, n, m, s;
	int i,j, l;
	
	fscanf(f, "%i %i %i", &n, &m, &s);
	int *q, *viz, *dist;
	q=(int*)calloc(n+1, sizeof(int));
	viz=(int*)calloc(n+1, sizeof(int));
	dist=(int*)calloc(n+1, sizeof(int));
	
	while(m--)
	{
		int x,y;
		fscanf(f, "%i %i", &x, &y);
		v[x][++v[x][0]]=y;
		//v[y][++v[y][0]]=x;
	}
	
	
	q[0]=i=s; l=1;
	while(l)
	{
		for(j=1;j<=v[i][0];j++)
			if(viz[v[i][j]]==0 && NuEInCoada(q, l, v[i][j]))
				Enqueue(q, &l, v[i][j], dist, i);
		Afara(g, q, &l, viz);
		i=q[0];
	}
	
	for(i=1;i<=n;i++)
		fprintf(g,"%i ", (dist[i]==0 && i!=s) ? -1 : dist[i]);
	return 0;
}