Cod sursa(job #2150372)

Utilizator fylot3Bogdan Filote fylot3 Data 3 martie 2018 15:12:41
Problema BFS - Parcurgere in latime Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.64 kb
#include <fstream>
#include <list>
#include <vector>
#include <unordered_set>

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);
	std::vector<bool> discovered(V, false);
	// 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);
			}
		}
	}

	FILE *fout = fopen("bfs.out", "w");
	//std::ofstream fout("bfs.out");
	for (int i = 0; i < V; i++) {
		if (!discovered[i])
			distanceFromSource[i] = -1;
		fprintf(fout, "%d ", distanceFromSource[i]);
		//fout << distanceFromSource[i] << " ";
	}
	fclose(fout);
}

int main(void) {
	int N, M, Source, s, d;
	FILE *fin = fopen("bfs.in", "r");
	//std::ifstream fin("bfs.in");
	//fin >> N >> M >> Source;
	fscanf(fin, "%d%d%d", &N, &M, &Source);

	Graph graph = Graph(N);
	for (; M > 0; M--) {
		fscanf(fin, "%d%d", &s, &d);
		//fin >> s >> d;
		graph.addDirectedEdge(s - 1, d - 1);
	}
	fclose(fin);

	graph.BreadthFirstSearch(Source - 1);
	return 0;
}