Cod sursa(job #248147)

Utilizator andreisfrentSfrent Andrei andreisfrent Data 24 ianuarie 2009 23:10:07
Problema BFS - Parcurgere in latime Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include<stdio.h>
#include<queue.h>

#define MAX_NODURI 100000
#define MAX_ARCE 1000000

int n, m, s; //numarul de noduri, numarul de muchii, nodul de plecare

int* la[MAX_NODURI + 1];
int nr_vecini[MAX_NODURI + 1];

void citeste_date()
{
	freopen("bfs.in", "r", stdin);
	scanf("%d%d%d\n", &n, &m, &s);
	int i;
	int arce[MAX_ARCE][2];
	for(i=0;i<m;++i)
	{
		scanf("%d%d\n", &arce[i][0], &arce[i][1]);
		++nr_vecini[arce[i][0]];
	}
	for(i=1;i<=n;++i)
	{
		la[i] = new int[nr_vecini[i] + 1];
		la[i][0] = 0;

	int x, y;
	for(i=0;i<m;++i)
	{
		x = arce[i][0];
		y = arce[i][1];
		la[x][0]++;
		la[x][la[x][0]] = y;
	}
	fclose(stdin);
}

int d[MAX_NODURI];

void parcurgere_latime(int sursa)
{
	int i, e, v;
	for(i = 1; i <= n; ++i) d[i] = -1;
	d[sursa] = 0;
	queue<int> q;
	q.push(sursa);
	while(!q.empty())
	{
		e = q.front();
		q.pop();
		
		for(i=1;i<=la[e][0];++i)
		{
			v = la[e][i];
			if(d[v] == -1)
			{
				d[v] = d[e] + 1;
				q.push(v);
			}
		}
	}
}


void scrie_rezultat()
{
	freopen("bfs.out", "w", stdout);
	for(int i = 1;i<=n;++i) printf("%d ", d[i]);
	printf("\n");
	fclose(stdout);
}

int main()
{
	citeste_date();
	parcurgere_latime(s);
	scrie_rezultat();
	return 0;
}