Cod sursa(job #1450998)

Utilizator GilgodRobert B Gilgod Data 15 iunie 2015 17:50:23
Problema BFS - Parcurgere in latime Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include <iostream>
#include <list>
#include <vector>
#include <queue>
#include <bitset>

#define INF 0x3f3f3f3f

const char IN[] = "bfs.in", OUT[] = "bfs.out";
const int NMAX = 100001;

using namespace std;

list<int> G[NMAX];
int N, M, S;

inline void read_data() {
	freopen(IN, "r", stdin);
	scanf("%d %d %d", &N, &M, &S);
	for (int j = 0; j < M; ++j) {
		int src, dst;
		scanf("%d %d", &src, &dst);
		G[src].push_back(dst);
	}
	fclose(stdin);
}

inline vector<int> bfs(int source) {
	queue<int> Q;
	bitset<NMAX> visited;
	vector<int> dist(N+1, INF);
	Q.push(source);
	visited[source].flip();
	dist[source] = 0;
	while (!Q.empty()) {
		int node = Q.front(); Q.pop();
		for (auto& n : G[node]) {
			if (!visited[n]) {
				Q.push(n);
				visited[n].flip();
				dist[n] = dist[node] + 1;
			}
		}
	}
	return dist;
}

int main() {
	read_data();
	freopen(OUT, "w", stdout);
	vector<int> dist = bfs(S);
	for (int i = 1; i <= N; ++i) {
		printf("%d ", (dist[i] > N) ? -1 : dist[i]);
	}
	fclose(stdout);
	return 0;
}