[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 @   ZXPrism  阅读(17)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示