Pagini recente » Cod sursa (job #2797004) | Cod sursa (job #2094720) | Monitorul de evaluare | Cod sursa (job #2317169) | Cod sursa (job #1383273)
#include<vector>
#include<algorithm>
#include<fstream>
#include<iostream>
#include<queue>
#include<set>
using namespace std;
vector<int> adj[100004];
queue<pair<int, int> > Q;
set<int> visited;
void clear( queue<pair<int, int> > &q )
{
queue<pair<int,int> > empty;
swap( q, empty );
}
int bfs(int start, int end) {
if(start == end) {
return 0;
}
int depth = 1;
visited.insert(start);
int v_size = adj[start].size();
for(int i = 0; i < v_size; ++i) {
Q.push(make_pair(adj[start][i], depth));
visited.insert(adj[start][i]);
}
// cout << "\n start:" << start << "\n";
while(!Q.empty()) {
pair<int, int> el = Q.front(); Q.pop();
int currentNode = el.first;
int currentDepth = el.second;
// cout << " cN:" << currentNode << " cD:" << currentDepth << "\n";
if(currentNode == end) {
clear(Q);
visited.clear();
return currentDepth;
}
else {
v_size = adj[currentNode].size();
for(int i = 0; i < v_size; ++i) {
if(visited.find(adj[currentNode][i]) == visited.end()){
Q.push(make_pair(adj[currentNode][i], currentDepth + 1));
visited.insert(currentNode);
}
}
}
}
visited.clear();
return -1; // should never happen
}
int main() {
ifstream fin("bfs.in");
ofstream fout("bfs.out");
int N,M,S; fin >> N >> M >> S;
for(int i = 0; i < M; ++i) {
int from,to; fin >> from >> to;
adj[from].push_back(to);
}
fout << bfs(S, 1);
for(int i = 2; i <= N; ++i) {
fout << " " << bfs(S, i);
}
fout << "\n";
return 0;
}