Pagini recente » Cod sursa (job #2456170) | Cod sursa (job #459746) | Cod sursa (job #937580) | Cod sursa (job #2150372)
#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;
}