请完善下面的程序,使用 BFS 统计一张边权都为 $1$ 的图中,从给定起点到所有点的距离:
#include<algorithm>
#include<cstdio>
#include<vector>
#define N 200020
using namespace std;
int n, m;
vector < int > G[N];
int q[N], hd, tl;
int dis[N];
void BFS(_____(1)_____) {
hd = 1, tl = 0;
for (int i = 1; i <= n; i++) dis[i] = -1;
q[++tl] = st, dis[st] = 0;
while (_____(2)_____) {
int u = q[hd++];
for (int i = 0; i < G[u].size(); i++) {
int v = G[u][i];
if (_____(3)_____) continue;
dis[v] = dis[u] + 1;
q[++tl] = v;
}
}
}
int main() {
scanf("%d%d", & n, & m);
for (int i = 1; i <= m; i++) {
int x, y;
scanf("%d%d", & x, & y);
G[x].push_back(y);
_____(4)_____;
}
int st;
scanf("%d", & st);
BFS(st);
for (_____(5)_____) printf("%d ", dis[i]);
return 0;
}
1. D。
2. C。
3. C。
4. A。
5. B。
通过 `BFS` 来找到最段路,`BFS` 需要使用队列来维护点,这里是通过数组来模拟队列的,维护 `hd` 和 `tl` 作为其首尾指针。 `BFS` 时要注意的是每个点只会被访问一次,所以如果 `dis!=-1` 那就是已经访问过可以直接 `continue` 。