Pagini recente » Cod sursa (job #1936481) | Cod sursa (job #2805339) | Cod sursa (job #616130) | Cod sursa (job #3040754) | Cod sursa (job #2035467)
#include <fstream>
#include <queue>
using namespace std;
ifstream cin ("bfs.in");
ofstream cout ("bfs.out");
struct edge{
edge(){
next_node = 0;
next_edge = NULL;
}
int next_node;
edge *next_edge;
};
bool used [100100];
int ans [100100];
edge *list[100100];
queue <int> Q;
class Graf {
public:
Graf(){
for (auto &x : list){
x = NULL;
}
}
void make_edge(int a , int b){
Make_Edge(a , b);
}
private:
void Make_Edge(int a , int b){
edge *now = new edge();
now -> next_node = b;
now -> next_edge = list[a];
list[a] = now;
}
};
void bfs(){
while(!Q.empty()){
int now = Q.front();
Q.pop();
for (edge *i = list[now]; i != NULL; i = i -> next_edge){
int next_node = i -> next_node;
if (!used[next_node]){
Q.push(next_node);
used[next_node] = true;
ans[next_node] = ans[now] + 1;
}
}
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
Graf *G = new Graf();
int nodes , edges , s;
cin>>nodes>>edges>>s;
for (int i=1; i<=edges; i++){
int a , b;
cin>>a>>b;
if (a == b){
continue;
}
G -> make_edge(a , b);
}
Q.push(s);
ans[s] = 0;
used[s] = true;
bfs();
for (int i=1; i<=nodes; i++){
if (ans[i] == 0 && i != s){
cout<<-1<<" ";
}
else{
cout<<ans[i]<<" ";
}
}
return 0;
}