Pagini recente » Monitorul de evaluare | Monitorul de evaluare | Monitorul de evaluare | Monitorul de evaluare | Cod sursa (job #2017745)
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
vector <vector <int> > graph;
vector <int> distances;
int start;
ifstream in ("bfs.in" );
ofstream out("bfs.out");
void read() {
unsigned long long nodes, edges;
in >> nodes >> edges >> start;
graph.resize(nodes + 1);
for (int pairIndex = 0; pairIndex < edges; pairIndex++) {
int left, right;
in >> left >> right;
if (left == right) {
continue;
}
bool rightIsUnique = find(
graph[left].begin(), graph[left].end(), right
) == graph[left].end();
if (rightIsUnique) {
graph[left].push_back(right);
}
}
}
void initDistances() {
distances.resize(graph.size());
fill(distances.begin(), distances.end(), -1);
distances[start] = 0;
}
void shortestWay() {
vector<int> queue;
queue.push_back(start);
for (int index = 0; index < queue.size(); index++) {
int node = queue[index], neighborIndex = 0;
for (; neighborIndex < graph[node].size(); neighborIndex++) {
int neighbor = graph[node][neighborIndex];
if (distances[neighbor] != -1) {
continue;
} else {
distances[neighbor] = distances[node] + 1;
queue.push_back(neighbor);
}
}
}
}
void write() {
for (int index = 1; index < distances.size(); index++) {
out << distances[index] << ' ';
}
}
int main() {
read();
initDistances();
shortestWay();
write();
return 0;
}