Pagini recente » Cod sursa (job #2454005) | Cod sursa (job #3204020) | Cod sursa (job #1902293) | Cod sursa (job #2298296) | Cod sursa (job #1770738)
#include <fstream>
#include <vector>
#include <queue>
class BasicDirectedGraph
{
int mSize;
std::vector<int> *mEdges;
public:
BasicDirectedGraph(int size)
{
mSize = size;
mEdges = new std::vector<int>[size+1];
}
void addEdge(int a, int b)
{
mEdges[a].push_back(b);
}
std::vector<int> getDistancesFromSource(int source)
{
std::vector<int> distances(mSize + 1, -1);
distances[source] = 0;
std::queue<int> bfs_queue;
bfs_queue.push(source);
while (!bfs_queue.empty()) {
int tmp = bfs_queue.front();
bfs_queue.pop();
for (int x : mEdges[tmp]) {
if (distances[x] == -1) {
distances[x] = distances[tmp] + 1;
bfs_queue.push(x);
}
}
}
return distances;
}
~BasicDirectedGraph()
{
delete[] mEdges;
}
};
int main()
{
std::ifstream inputStream("bfs.in");
std::ofstream outputStream("bfs.out");
int n, m, s;
inputStream >> n >> m >> s;
BasicDirectedGraph graph(n);
for(int i = 0; i < m; ++i) {
int a, b;
inputStream >> a >> b;
graph.addEdge(a, b);
}
auto distances = graph.getDistancesFromSource(s);
for(int i = 1; i < distances.size(); ++i) outputStream << distances[i] << ' ';
outputStream << '\n';
return 0;
}