Pagini recente » Cod sursa (job #744448) | Cod sursa (job #3255367) | Cod sursa (job #1254793) | Cod sursa (job #1187720) | Cod sursa (job #1383274)
#include<vector>
#include<algorithm>
#include<fstream>
#include<iostream>
#include<queue>
#include<set>
using namespace std;
vector<int> adj[100004];
queue<pair<int, int> > Q;
bool visited[100004];
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[start] = true;
int v_size = adj[start].size();
for(int i = 0; i < v_size; ++i) {
Q.push(make_pair(adj[start][i], depth));
visited[adj[start][i]] = true;
}
// 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);
return currentDepth;
}
else {
v_size = adj[currentNode].size();
for(int i = 0; i < v_size; ++i) {
if(visited[adj[currentNode][i]] == false){
Q.push(make_pair(adj[currentNode][i], currentDepth + 1));
visited[currentNode] = true;
}
}
}
}
return -1;
}
void clearVisited(int N) {
for(int i = 1; i <= N; ++i) {
visited[i] = false;
}
}
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);
clearVisited(N);
for(int i = 2; i <= N; ++i) {
fout << " " << bfs(S, i);
clearVisited(N);
}
fout << "\n";
return 0;
}