Pagini recente » Cod sursa (job #1729239) | Cod sursa (job #1962283) | Rating Fedorovici Dragos (fedo) | Cod sursa (job #1762592)
#include <fstream>
#include <vector>
#include <queue>
class SimpleDirectedGraph
{
int mSize;
std::vector<int> *edges;
public:
SimpleDirectedGraph(int size)
{
mSize = size + 1;
edges = new std::vector<int>[mSize];
}
void addEdge(int a, int b)
{
edges[a].push_back(b);
}
std::vector<int> computeDistanceFromSource(int s)
{
std::vector<int> distances(mSize, -1);
if (s <= 0 || s >= mSize) return distances;
std::queue<int> bfs_queue;
bfs_queue.push(s);
distances[s] = 0;
while (!bfs_queue.empty()) {
int current_vertex = bfs_queue.front();
bfs_queue.pop();
for (int vertex : edges[current_vertex]) {
if (distances[vertex] == -1) {
distances[vertex] = distances[current_vertex] + 1;
bfs_queue.push(vertex);
}
}
}
return distances;
}
};
int main()
{
std::ifstream input("bfs.in");
std::ofstream output("bfs.out");
int n, m, s;
input >> n >> m >> s;
SimpleDirectedGraph graph(n);
for (int i = 0; i < m; ++i) {
int a, b;
input >> a >> b;
graph.addEdge(a, b);
}
auto distances = graph.computeDistanceFromSource(s);
for (int i = 1; i <= n; ++i) output << distances[i] << ' ';
output << '\n';
return 0;
}