广搜:记步数
约 8 分钟
BFS 求最短不光要知道"能不能到",还要报出"走了几步"。做法很简单:开一个数组 dist,记录从起点到每个点的步数。每扩展到一个新点,它的步数就等于把它带出来的那个点的步数加一。
dist[start] = 0; // 起点自己是 0 步
q.push(start);
while (!q.empty()) {
int u = q.front(); q.pop();
for (int v : next(u))
if (dist[v] == -1) { // -1 表示还没到过
dist[v] = dist[u] + 1; // 步数 = 上一个点 + 1
q.push(v);
}
}
起点的步数记成 0,因为它不用走就到了(如果题目问的是"经过几个点",那才可能记成 1,看定义)。终点的答案就是 dist[终点]。
这个 dist 数组一举两得:既记了步数,又能兼作"是否访问过"的标记——初始化成 ,等于 就是没到过。这样能省掉一个 vis 数组。坑:别忘了先给起点赋 0,否则起点也会被当成没访问,逻辑就乱了。
小纸条
起点的步数记成几?
登录 后可看答案