Cod sursa(job #830864)

Utilizator Rares95Rares Arnautu Rares95 Data 7 decembrie 2012 19:52:53
Problema BFS - Parcurgere in latime Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
# include <cstdio>
# include <vector>
# include <queue>
# include <bitset>
using namespace std;
# define Nmax 100005

class Level
{
	private :
		int n, m, start, x, y, i;
		int Lvl[Nmax];
		vector<int> :: iterator it;
		vector <int> V[Nmax];
		queue <int> Q;
		bitset <Nmax> Check;
	public :
		Level()
		{
			for (i = 1; i < Nmax; ++i)
				Lvl[i] = -1;
		}

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

			fscanf (INPUT_FILE, "%d%d%d", &n, &m, &start);
			for (i = 1; i <= m; ++i)
			{
				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 (i = 1; i <= n; ++i)
			{
				fprintf (OUTPUT_FILE, "%d ", Lvl[i]);
			}
			fprintf (OUTPUT_FILE, "\n");

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

int main ()
{
	Level *graf = new Level();
	graf->read();
	graf->breadthTraversal();
	graf->write();
	return 0;
}