Cod sursa(job #1277727)

Utilizator evodaniVasile Daniel evodani Data 28 noiembrie 2014 01:21:44
Problema BFS - Parcurgere in latime Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <cstdio>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
FILE *fin, *fout;

#define NMAX 100005

struct step {
	int node, dist;
};

void bfs (vector <vector<int> > &graf, int n, vector<int> &dist, int startNode) {
	queue<step> Q;
	int nbs, node, i;
	bool inQueue[NMAX];
	memset(inQueue, 0, sizeof(bool) * NMAX);

	step aux, aux2;
	aux.node = startNode; aux.dist = 1;
	Q.push(aux); inQueue[startNode] = 1;

	while (!Q.empty()) {
		aux = Q.front(); Q.pop(); node = aux.node;
		dist[node] = aux.dist;

		nbs = graf[node].size();
		for (i=0; i<nbs; ++i) {
			if (!inQueue[graf[node][i]]) {
				aux2.node = graf[node][i];
				aux2.dist = aux.dist + 1;

				Q.push(aux2);
				inQueue[graf[node][i]] = 1;
			}
		}
	}
}

int main() {
	fin = fopen ("bfs.in", "r"); fout = fopen ("bfs.out", "w");

	int n, m, s, i, a, b;
	fscanf (fin, "%d%d%d", &n, &m, &s);
	vector <vector<int> > graf(n+1);
	vector<int> dist(n+1);

	for (i=1; i<=m; ++i) {
		fscanf (fin, "%d%d", &a, &b);
		graf[a].push_back(b);
	}

	bfs(graf, n, dist, s);

	for (i=1; i<=n; ++i)
		if (dist[i]>0) fprintf (fout, "%d ", dist[i]-1);
		else fprintf (fout, "-1 ");

	fclose(fin); fclose(fout);
	return 0;
}