Cod sursa(job #2149832)

Utilizator fylot3Bogdan Filote fylot3 Data 3 martie 2018 00:37:59
Problema BFS - Parcurgere in latime Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <fstream>
#include <list>
#include <vector>

std::vector<bool> discovered;

class Graph {
	int V;
	std::list<int> *adj;

public:
	Graph(int V);
	void addDirectedEdge(int s, int d);

	/* Breadth First Search */
	void BreadthFirstSearch(int sourceNode);
};

Graph::Graph(int V) {
	this->V = V;
	adj = new std::list<int>[V];
}

void Graph::addDirectedEdge(int s, int d) {
	adj[s].push_back(d);
}

void Graph::BreadthFirstSearch(int sourceNode) {
	std::vector<int> distanceFromSource(V, 0);
	discovered.resize(V, false);

	std::list<int> Q;
	Q.push_back(sourceNode);
	discovered[sourceNode] = true;

	while (!Q.empty()) {
		int nodeToProcess = Q.front();
		Q.pop_front();
		for (auto it = adj[nodeToProcess].begin(); it != adj[nodeToProcess].end(); it++) {
			if (!discovered[*it]) {
				distanceFromSource[*it] = distanceFromSource[nodeToProcess] + 1;
				discovered[*it] = true;
				Q.push_back(*it);
			}
		}
	}

	std::ofstream fout("bfs.out");
	for (int i = 0; i < V; i++) {
		if (!discovered[i])
			distanceFromSource[i] = -1;
		fout << distanceFromSource[i] << " ";
	}
}

int main(void) {
	int N, M, Source, s, d;
	std::ifstream fin("bfs.in");
	fin >> N >> M >> Source;

	Graph graph = Graph(N);
	for (; M > 0; M--) {
		fin >> s >> d;
		graph.addDirectedEdge(s - 1, d - 1);
	}

	graph.BreadthFirstSearch(Source - 1);
}