广搜:记步数

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,否则起点也会被当成没访问,逻辑就乱了。

小纸条

起点的步数记成几?

登录 后可看答案

广搜:记步数 · 考级冲刺 · op599 课程