[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] == 1continue

posted @ 2024-05-18 10:57  ZXPrism  阅读(38)  评论(0)    收藏  举报