Cod sursa(job #830812)

Utilizator Rares95Rares Arnautu Rares95 Data 7 decembrie 2012 18:57:59
Problema BFS - Parcurgere in latime Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
# include <cstdio>
# include <vector>
# include <queue>
# include <bitset>

using namespace std;

int const Nmax = 100005;

int n, m, start;
void read(), write(), breadthTraversal();

vector <int> V[Nmax];
queue <int> Q;
bitset <Nmax> Check;

class Level
{
	public :
		int Lvl[Nmax];
		Level()
		{
			for (int i = 1; i < Nmax; ++i)
				Lvl[i] = -1;
		}
};

Level graf;

int main ()
{
	read();
	breadthTraversal();
	write();
	return 0;
}


void read ()
{
	FILE *INPUT_FILE;
	INPUT_FILE = fopen ("bfs.in", "rt");

	fscanf (INPUT_FILE, "%d%d%d", &n, &m, &start);
	for (int i = 1; i <= m; ++i)
	{
		int x, y;
		fscanf (INPUT_FILE, "%d%d", &x, &y);
		V[x].push_back(y);
	}

	fclose (INPUT_FILE);

}
void write ()
{
	FILE *OUTPUT_FILE;
	OUTPUT_FILE = fopen ("bfs.out", "wt");

	for (int i = 1; i <= n; ++i)
	{
		fprintf (OUTPUT_FILE, "%d ", graf.Lvl[i]);
	}

	fprintf (OUTPUT_FILE, "\n");

	fclose (OUTPUT_FILE);
}
void breadthTraversal ()
{
	graf.Lvl[start] = 0;
	Check[start].flip();
	Q.push(start);
	for (; !Q.empty(); Q.pop())
	{
		int now = Q.front();
		for (vector<int> :: iterator it = V[now].begin(); it != V[now].end(); ++it)
		{
			if (!Check[*it])
			{
				Check[*it].flip();
				Q.push(*it);
				graf.Lvl[*it] = graf.Lvl[now] + 1;
			}
		}
	}
}