Cod sursa(job #995499)

Utilizator razvan9310FMI - Razvan Damachi razvan9310 Data 9 septembrie 2013 00:56:48
Problema BFS - Parcurgere in latime Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <fstream>
#include <vector>
#include <bitset>
#include <queue>
using namespace std;
const int INF = 1<<30;

class directed_graph {
	vector<int> *G;
	const int size;

  public:
	directed_graph(const int &size_source): size(size_source) {
		G = new vector<int>[size+1];
	}
	
	~directed_graph() {
		delete[] G;
	}

	void addEdge(const int &from, const int &to) {
		G[from].push_back(to);
	}

	vector<int> getDistance(const int &source) {
		vector<int> dist(size+1, INF);
		dist[source] = 0;
		queue<int> que; que.push(source);
		bool *visited = new bool[size+1];
		for (int i=0; i<=size; ++i) {
			visited[i] = 0;
		}
		visited[source] = 1;
		while (que.empty() == 0) {
			int node = que.front();
			que.pop();
			for (int i = 0; i <G[node].size(); ++i) {
				if (visited[G[node][i]] == 0) {
					visited[G[node][i]] = 1;
					que.push(G[node][i]);
					dist[G[node][i]] = dist[node] + 1;
				}
			}
		}
		delete[] visited;
		return dist;
	}
};

int main() {
	ifstream in("bfs.in"); ofstream out("bfs.out");
	int N, M, source;
        in>>N>>M>>source;
	directed_graph G(N);
	for (int i = 0; i < M; ++i) {
		int from, to;
		in>>from>>to;
		G.addEdge(from, to);
	}

	vector<int> dist = G.getDistance(source);
	for (int i = 0; i < dist.size(); ++i) {
		if (dist[i] == INF) {
			out<<"-1 ";
		} else {
			out<<dist[i]<<" ";
		}
	}

	in.close(); out.close();
	return 0;
}