共42道题,当前是第17

初赛真题

请完善下面的程序,使用 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` 。

Question

1. 上述程序 (1) 中应该填写( )

2. 上述程序 (2) 中应该填写( )

3. 上述程序 (3) 中应该填写( )

4. 上述程序 (4) 中应该填写( )

5. 上述程序 (5) 中应该填写( )

陈伦制作 版权所无 粤ICP备16127491号-1