int num_vertices; // number of vertices
int num_edges; // number of edges
vi adj_list[num_vertices]; // adjacency list
vi dist(num_vertices, -1); // array storing distances to each vertex
void add_edge(int from, int to){
adj_list[from].pb(to);
}
void BFS(int source){
vb visited(num_vertices, false);
queue<int> q;
q.push(source);
visited[source] = true;
dist[source] = 0;
while(q.size()){
int cur_vertex = q.front();
vi cur_vertex_adj = adj_list[cur_vertex];
FOR(i, cur_vertex_adj.size()){
int adj_vertex = cur_vertex_adj[i];
if(visited[adj_vertex] == false){
visited[adj_vertex] = true;
dist[adj_vertex] = dist[cur_vertex] + 1;
q.push(adj_vertex);
}
}
q.pop();
}
}