Cod sursa(job #1445690)

Utilizator mouse_wirelessMouse Wireless mouse_wireless Data 30 mai 2015 19:38:36
Problema BFS - Parcurgere in latime Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.59 kb
#include <cstdio>
#include <cassert>
#include <algorithm>
#include <vector>
#include <list>
#include <queue>
using namespace std;
#define _submit
#ifdef _submit
#define InFile "bfs.in"
#define OutFile "bfs.out"
#else
#define InFile "fis.in"
#define OutFile "fis.out"
#endif

class graph {
private:
	vector< list<int> > adiac;
	graph();
public:
	const list<int>& getList(int);
	graph(int);
	void addEdge(int, int);
	vector<int> BFS(int);
	int size();
};

graph::graph(int nrnod) {
	adiac.resize(nrnod);
}

const list<int>& graph::getList(int nod) {
	return adiac[nod];
}

void graph::addEdge(int n1, int n2) {
	adiac[n1].push_back(n2);
}

int graph::size() {
	return adiac.size();
}

vector<int> graph::BFS(int startNod) {
	vector<char> visited(size(), 0);
	vector<int> levels(size(), -1);
	queue<int> Q;
	Q.push(startNod);
	levels[startNod] = 0;
	while (!Q.empty()) {
		int curNod = Q.front();
		Q.pop();
		if (visited[curNod])
			continue;
		visited[curNod] = 1;
		const list<int>& vecini = getList(curNod);
		for (auto i = vecini.begin(); i != vecini.end(); ++i)
		if (!visited[*i]) {
			levels[*i] = levels[curNod] + 1;
			Q.push(*i);
		}
	}
	return levels;
}

int main() {
	assert(freopen(InFile, "r", stdin));
	assert(freopen(OutFile, "w", stdout));
	int N, M, S;
	scanf("%d%d%d", &N, &M, &S);
	graph *G = new graph(N);
	for (int i = 0; i < M; i++) {
		int n1, n2;
		scanf("%d%d", &n1, &n2);
		G->addEdge(n1-1, n2-1);
	}
	vector<int> dist = G->BFS(S-1);
	for (auto i = dist.begin(); i != dist.end(); ++i)
		printf("%d ", *i);
	return 0;
}