Pagini recente » Cod sursa (job #1355393) | Cod sursa (job #1532139) | Cod sursa (job #2083481) | Cod sursa (job #2620279) | Cod sursa (job #1705375)
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <fstream>
#include <vector>
#include <list>
#include <queue>
long long bfs(unsigned int N, unsigned int init_node, unsigned dest_node, std::vector<std::list<unsigned int> > &adj) {
if (init_node == dest_node) return 0;
if (init_node > N) return -1;
// BFS
unsigned int curr_node;
long long distance = 0;
bool visited[N + 1];
std::memset(visited, false, N+1);
std::queue<unsigned int> q;
// Adaug nodul initial
q.push(init_node);
visited[init_node] = true;
while (!q.empty()) {
curr_node = q.front(); q.pop();
if (curr_node == dest_node) return distance;
bool found_neighs = false;
for (std::list<unsigned int>::iterator neigh = adj[curr_node].begin(); neigh != adj[curr_node].end(); neigh++) {
if (!visited[*neigh]) {
q.push(*neigh);
visited[*neigh] = true;
found_neighs = true;
}
}
if (found_neighs) distance++;
}
return -1;
}
int main(int argc, char **argv) {
std::ifstream input("bfs.in");
if (!input.is_open()) {
std::cerr << "Cannot open input file!" << std::endl;
std::exit(-1);
}
std::ofstream output("bfs.out");
if (!output.is_open()) {
std::cerr << "Cannot open output file!" << std::endl;
input.close();
std::exit(-2);
}
// Citire Graph
unsigned int N, M, u, v, dest_node;
input >> N >> M >> dest_node;
std::vector<std::list<unsigned int> > adj(N + 1, std::list<unsigned int>());
while(input >> u >> v) {
if (u == v) continue;
adj[u].push_back(v);
}
for (int i = 1; i <= N; i++)
std::cout << bfs(N, i, dest_node, adj) << " ";
input.close();
output.close();
return 0;
}