Pagini recente » Cod sursa (job #3275263) | Cod sursa (job #668318) | Cod sursa (job #2326144) | Cod sursa (job #2780693) | Cod sursa (job #2223871)
#include <fstream>
#include <vector>
#include <string>
#include <queue>
#include <algorithm>
#include <tuple>
using namespace std;
typedef vector<vector<int>> Graph;
const string IN_FILE = "bfs.in";
const string OUT_FILE = "bfs.out";
vector<int> bfs(const Graph& graph, const int source) {
auto distances = vector<int>(int(graph.size()), -1);
distances[source] = 0;
queue<int> q;
for (q.push(source); !q.empty(); q.pop()) {
const int u = q.front();
for (const auto& v : graph[u]) {
if (distances[v] == -1) {
distances[v] = distances[u] + 1;
q.push(v);
}
}
}
return distances;
}
pair<Graph, int> readInput() {
ifstream in(IN_FILE);
int V, E, S;
in >> V >> E >> S;
auto graph = Graph(V);
for (int i = 0; i < E; i++) {
int u, v;
in >> u >> v;
graph[u - 1].push_back(v - 1);
}
return make_pair(graph, S - 1);
}
void writeOutput(const vector<int>& distances) {
ofstream out(OUT_FILE);
for (int u = 0; u < int(distances.size()); u++) {
out << distances[u] << (u + 1 < int(distances.size()) ? " " : "\n");
}
out.close();
}
int main() {
Graph graph;
int source;
tie(graph, source) = readInput();
const auto distances = bfs(graph, source);
writeOutput(distances);
return 0;
}