Cod sursa(job #475560)

Utilizator ilie.danilaIlie Teodor Danila ilie.danila Data 7 august 2010 14:55:43
Problema BFS - Parcurgere in latime Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <fstream>
#include <vector>

using namespace std;

struct node
{
	int value;
	vector<node*> neighborhs;
};

int n, m, s, i;
int sel[100001];
int steps[100001];
vector<node*> nodes;
int bfsOrder[100001];

void bfs( node* aNodeToStart );

int main()
{
	ifstream f("bfs.in");
	ofstream g("bfs.out");

	f >> n >> m >> s;

	for( i = 0; i < n; i++ )
	{
		node* newNode = new node;
		newNode->value = i;
		nodes.push_back( newNode );
	}

	int x, y;

	for( i = 0; i < m; i++ )
	{
		f >> x >> y;
		x--;
		y--;
		nodes[x]->neighborhs.push_back( nodes[y] );
	}

	f.close();

	bfs( nodes[--s] );

	for( i = 0; i < n; i++ )
	{
		if( sel[i] )
			g << steps[i] << " ";
		else
			g << "-1 ";
	}

	g << "\n";

	g.close();

	return 0;
}

void bfs( node* aNodeToStart )
{
	int left = -1;
	int right = 0;
	bfsOrder[right] = aNodeToStart->value;
	sel[aNodeToStart->value] = 1;

	while( left < right )
	{
		left++;
		for( i = 0; i < nodes[bfsOrder[left]]->neighborhs.size(); i++ )
		{
			if( !sel[nodes[bfsOrder[left]]->neighborhs[i]->value] )
			{
				right++;
				bfsOrder[right] = nodes[bfsOrder[left]]->neighborhs[i]->value;
				sel[nodes[bfsOrder[left]]->neighborhs[i]->value] = 1;
				steps[nodes[bfsOrder[left]]->neighborhs[i]->value] = 1 + steps[bfsOrder[left]];
			}
		}
	}
}