快捷键

切换暗色模式 CtrlD
搜索 CtrlK
关闭弹窗 Esc
返回顶部 Ctrl
快捷键面板 Ctrl/
C++信息学奥赛打字闯关
首页 闯关训练 段位系统 题库中心
技术博客 新闻资讯
排行榜 信奥社区 成就殿堂 在线留言 AI助手
📑 文章目录

BFS 与广度优先搜索进阶:最短路、双端队列 BFS、A*

❤️ 760 点赞
💬 0 评论
👁️ 25830 阅读
🔄 更新于 2026-09-16 22:39

BFS 是另一种基础搜索算法,在图论和搜索中有着广泛的应用。

一、BFS 本质
BFS = 广度优先搜索 = 层层扩展,像水波扩散。
核心数据结构:队列(queue)

queue<int> q;
q.push(start);
vis[start] = 1;
while (!q.empty()) {
    int u = q.front(); q.pop();
    for (int v : 邻接的节点) {
        if (!vis[v]) {
            vis[v] = 1;
            dis[v] = dis[u] + 1;
            q.push(v);
        }
    }
}


二、BFS 的典型应用
  1. 无权图的最短路径(边权为 1)

  2. 迷宫问题

  3. 求连通块

  4. 树的层次遍历

  5. 多源 BFS


三、0-1 BFS(双端队列 BFS)
用于边权只有 0 或 1 的图:
  • 遇到权为 0 的边 → 从队首插入

  • 遇到权为 1 的边 → 从队尾插入

  • 本质上是 Dijkstra 的特化版本


四、双向 BFS
从起点和终点同时 BFS,在中间相遇。复杂度从 O(b^d) 降至 O(b^(d/2))。

五、A* 算法
结合 BFS 和贪心策略,使用启发式函数估计到目标的距离:
  • 优先级 = 已走距离 + 估计剩余距离

  • 当估计函数可纳(admissible)时,保证最优解


六、BFS 技巧总结
  • 状态压缩:用整数/字符串表示状态

  • vis 数组设计:根据状态空间选择合适的标记方式

  • 剪枝:提前排除不可行的状态


推荐练习
  • 洛谷 P1443 马的遍历(基础 BFS)

  • 洛谷 P1141 01迷宫

  • 洛谷 P1602 字串变换(双向 BFS)

  • 洛谷 P1379 八数码难题(A*)

💬 评论 (0)

暂无评论,快来抢沙发吧~ 🛋️

在线

给管理员留言

每条留言老师都会认真阅读并回复

📚 课程咨询 🔧 技术求助 💡 建议反馈 🤝 合作联系

留言发送成功!

您的留言已送达管理员后台

追踪码(请保存以便查询回复)
------