[CP] DFS / BFS 图遍历时重复访问的问题
while (!s.empty()) {
auto [x, y] = s.front();
s.pop();
vis[x][y] = 1;
cur += map[x][y];
for (int i = 0; i < 4; i++) {
int nx = x + dx[i], ny = y + dy[i];
if (nx >= 0 && nx < n && ny >= 0 && ny < m && !vis[nx][ny]) {
s.push({nx, ny});
}
}
}
很久没写 dfs / bfs,昨天做一道遍历网格图的题目时发现答案总是偏大,经过 debug 发现有些节点重复访问了,而且无论使用的是 dfs 还是 bfs 都有相同的问题。
上面就是出错的代码部分。
显然,问题在于和 vis 相关的逻辑。代码的策略是当发现一个节点没有访问过(vis[nx][ny] == 0 时将其放入栈 / 队列,在将某个节点弹出栈 / 队列时将其设定为已访问。然而,有时候会出现这种情况:在一个节点被放入栈 / 队列后,之后弹出的节点恰好与这个节点相邻,这样同样的节点就会被放入两次。
所以,应当在放入栈 / 队列时,就将 vis 设为 1,或者在 s.pop() 后面增加一条判断语句,如果 vis[x][y] == 1 则 continue。

浙公网安备 33010602011771号