跳转到内容

BFS

求最短步数、迷宫最短路、层次扩展、从一个状态逐层到达其他状态。

使用队列,先进入队列的状态先扩展,因此第一次到达某个状态时通常就是最短步数。

#include <bits/stdc++.h>
using namespace std;
int main() {
int n, start;
cin >> n >> start;
vector<vector<int>> g(n + 1);
vector<int> dist(n + 1, -1);
for (int i = 1; i < n; i++) {
int u, v;
cin >> u >> v;
g[u].push_back(v);
g[v].push_back(u);
}
queue<int> q;
q.push(start);
dist[start] = 0;
while (!q.empty()) {
int u = q.front();
q.pop();
for (int v : g[u]) {
if (dist[v] == -1) {
dist[v] = dist[u] + 1;
q.push(v);
}
}
}
for (int i = 1; i <= n; i++) cout << dist[i] << " ";
return 0;
}
  • 入队时没有立刻标记,导致同一个点重复入队。
  • 把 DFS 和 BFS 的容器混用。
  • 忘记判断边界或障碍。