[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
。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理