快捷键

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

深度优先搜索(DFS)入门到进阶:回溯、剪枝、迭代加深

❤️ 850 点赞
💬 0 评论
👁️ 29208 阅读
🔄 更新于 2026-09-11 05:14

DFS 是最基础的搜索算法,但它的变化和应用非常丰富。

一、DFS 本质
DFS = 深度优先搜索 = 一条路走到黑,碰壁再回头。

void dfs(int u) {
    if (到达目标状态) { 处理答案; return; }
    for (每个可能的下一步 v) {
        if (v 合法且未访问) {
            标记 v 已访问;
            dfs(v);
            取消标记(回溯);
        }
    }
}


二、DFS 的三大应用场景
  1. 图/树的遍历:最基础的应用,前序/中序/后序遍历

  2. 回溯算法:八皇后、全排列、子集枚举、组合

  3. 记忆化搜索:用数组存储已计算状态,避免重复计算


三、剪枝技巧(非常重要!)
  • 可行性剪枝:当前分支不可能到达解,直接返回

  • 最优性剪枝:当前分支不会比已有最优解更好,直接返回

  • 顺序剪枝:改变搜索顺序,优先搜索更可能成功的分支

  • 对称性剪枝:利用对称性减少搜索空间


四、迭代加深搜索(IDDFS)
当搜索深度未知且可能很深时使用:
  • 设定深度限制 depth

  • 如果未找到解,逐步增加深度限制

  • 结合 A 启发式函数 → IDA 算法


五、DFS 序
DFS 遍历过程中给节点标号,子树对应连续区间,可将树上问题转化为序列问题。

六、双向搜索(Meet in the Middle)
将问题分成两半,分别 DFS 搜索,然后合并结果。复杂度从 O(2^n) 降至 O(2^(n/2))。

推荐练习
  • 八皇后:经典回溯

  • 洛谷 P1706 全排列问题

  • 洛谷 P1219 八皇后(加强版)

  • 洛谷 P1120 小木棍(经典 IDDFS + 剪枝)

💬 评论 (0)

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

在线

给管理员留言

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

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

留言发送成功!

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

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