Cod sursa(job #272427)

Utilizator robertzelXXX XXX robertzel Data 7 martie 2009 00:23:06
Problema BFS - Parcurgere in latime Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
#include <stdio.h>
#define max 100008

typedef struct elcoada {int nrnod; int cost;};
int cp, cu = -1;
int n,m,s;
int l[max][max], r[max], viz[max];
elcoada c[max];

void citeste ()
{
	int i,y,x;

	FILE * in = fopen("bfs.in","r");

	fscanf(in, "%d %d %d", &n, &m, &s);

	for (i=0; i<m; i++)
	{
		fscanf(in, "%d %d", &x, &y);

		l[x][0]++;
		l[x][l[x][0]] = y;
	}

	fclose(in);
}

void scrie ()
{
	int i;

	FILE * out = fopen("bfs.out", "w");

	for (i=1; i<=n; i++)
	{
		fprintf(out, "%d ", r[i]);
	}

	fclose(out);
}

void add (int nrnod, int cost)
{
	elcoada k;

	k.nrnod = nrnod;
	k.cost  = cost;

	if (cu == max)
	{
		cu = 0;
	}
	else
	{
		cu++;
	}

	c[cu] = k;
}


elcoada get ()
{
	elcoada k;

	k = c[cp];

	if (cp == max)
	{
		cp = 0;
	}
	else
	{
		cp++;
	}

	return k;
}

void calc (int e)
{
	elcoada k;
	int nrnod, cost,i;


	//reseteaza coada
	cp = 0;
	cu = -1;

	//reseteaza nodurile vizitate
	for (i=1; i<=n; i++)
	{
		viz[i] = 0;
	}

	if (s == e)
	{
		r[e] = 0;
		return;
	}

	add(s, 0);

	while (1==1)
	{
		k = get();

		nrnod = k.nrnod;
		cost  = k.cost;

		viz[nrnod] = 1;

		if (l[nrnod][0] == 0)
		{
			r[e] = -1;
			break;
		}

		for (i=1; i<=l[nrnod][0]; i++)
		{
			if (l[nrnod][i] == e)
			{
				r[e] = cost+1;
				return;
			}
			else
			{
				if (viz[l[nrnod][i]] == 0)
				{
					add(l[nrnod][i], cost+1);
				}
			}
		}
	}


}

void rezolva ()
{
	int i;

	for (i=1; i<=n; i++)
	{
		calc(i);
	}
}

int main ()
{
       citeste();
       rezolva();
       scrie();

       return 0;
}