Pagini recente » Cod sursa (job #169697) | Cod sursa (job #1946575) | Cod sursa (job #193038) | Cod sursa (job #2508738) | Cod sursa (job #3219915)
#include <iostream>
#include <queue>
#include <cstring>
#define FIN "bfs.in"
#define FOUT "bfs.out"
#define SIZE 500001
using namespace std;
int dist[SIZE];
bool visited[SIZE];
vector<int> Adj_List[SIZE];
queue<int> Queue;
int num_nodes,
num_edges,
source;
void read_graph() {
int x,y;
freopen(FIN, "r", stdin);
scanf("%d %d %d", &num_nodes, &num_edges, &source);
//printf("%d %d %d", num_nodes, num_edges, source);
for(;num_edges;num_edges--) {
scanf("%d %d", &x, &y);
Adj_List[x].push_back(y);
}
}
void BFS() {
int node;
for(int k = 1; k <= num_nodes; ++k) dist[ k ] = 0, visited[ k ] = false;
visited[ source ] = true;
Queue.push( source );
while(!Queue.empty()) {
node = Queue.front();
visited[ node ] = true;
Queue.pop();
for(vector<int>::iterator it = Adj_List[ node ].begin(); it != Adj_List[node].end(); ++it) {
if(!visited[ *it ]) {
visited[ *it ] = true;
Queue.push( *it );
dist[*it] = dist[ node ] + 1;
}
}
}
}
void write_solution() {
freopen(FOUT, "w", stdout);
for(int k = 1; k <= num_nodes; ++k) {
if(dist[k] != 0 ) printf("%d ", dist[k]);
else if(dist[k] == 0 && k == source) printf("%d ",0);
else printf("-1 ");
}
}
int main() {
read_graph();
BFS();
write_solution();
}