Pagini recente » Cod sursa (job #1487402) | Cod sursa (job #3180106) | Cod sursa (job #141016) | Cod sursa (job #1976010) | Cod sursa (job #2663608)
#include <iostream>
#include <fstream>
#include <list>
#include <vector>
#include <queue>
using namespace std;
ifstream in("bfs.in");
ofstream out("bfs.out");
class Graph {
int vertices, start;
list <int> *adj;
vector <int> costs;
vector <bool> visited;
public:
Graph(int v, int start) : vertices(v), start(start), costs(v), visited(v) {
adj = new list <int>[v];
}
void addEdge(int from, int to) {
adj[from].push_back(to);
}
void showAnswer() {
for (int i = 1; i < vertices; ++i) {
out << (costs[i] == 0 ? (i == start ? 0 : -1) : costs[i]);
if (i + 1 != vertices)
out << " ";
}
}
void solve() {
queue <int> q;
q.push(start);
while (q.size()) {
int top = q.front();
q.pop();
for (auto &adjVal : adj[top]) {
if (!visited[adjVal]) {
q.push(adjVal);
visited[top] = true;
costs[adjVal] = 1 + costs[top];
}
}
}
}
};
int main() {
int N, M, S;
in >> N >> M >> S;
Graph *myGraph = new Graph(N + 1, S);
while (M--) {
int from, to;
in >> from >> to;
myGraph -> addEdge(from, to);
}
myGraph -> solve();
myGraph -> showAnswer();
in.close();
out.close();
return 0;
}