[算法总结]DFS(深度优先搜索)
一、关于DFS
1. 什么是DFS
深度优先搜索算法,又称DFS(Depth First Search)。DFS算法是一种搜索算法,而搜索算法实质上是一种枚举,即借助计算机的高性能来有目的地枚举一个问题的部分情况或这个问题的所有情况,进而求出问题的解的一种方法。
2. DFS的搜索方式
根据算法的名字,我们很容易知道DFS是按照深度优先的顺序对所有的状态进行搜索的。
DFS算法是递归算法的一种。搜索时沿着树的深度遍历树的节点,并尽可能深地搜索树的分支(到叶子节点为止)。当节点v的所有边都被访问过时,搜索将回溯到发现节点v的那条边的起始节点。搜索过程一直进行到已发现从源节点可达的所有节点全部被访问为止。
二、DFS的具体实现
搭建一个dfs程序并不困难,真正值得我们注意的是dfs算法的剪枝部分。dfs的剪枝方法因题而异,但归类后大概分为5类。这一点我们稍后会提及。
这里给出一般dfs的框架:
void DFS(type n){ //可以描述阶段的状态
if(符合条件) {cout<<答案;return;} //出口
if(可以剪枝) return; //剪枝
for(i:1~p){ //选择该阶段的所有决策
选择可行决策; //剪枝的一种
标记已访问该点;
DFS(n+1); //进入下一阶段
(还原访问现场;)
}
}
三、剪枝
剪枝分为以下5类:
1. 顺序性剪枝
若一些题的搜索顺序对答案无影响,那么搜索顺序的不同会导致搜索树形态的改变,优先搜索分支较少的阶段,此时能减少搜索的规模。
2. 重复性剪枝
在搜索的时候如果有多种方式可以到达一个状态,那么我们只需要搜索一个分支就可以了。
3. 可行性剪枝
可行性剪枝是对搜索正确性的一个保证,当分支在递归边界的时候回溯。
4. 最优性剪枝
在搜索过程中,如果当前阶段的代价已经超过我们已知的最小代价,那么此时继续搜索下去就失去了意义。
5. 记忆化剪枝
记录搜索状态的结果,当重复遍历一个状态的时候就可以直接返回这个状态的答案,避免重复的搜索。
四、练习
- P1025 数的划分
- P1034 矩形覆盖
- P1074 靶形数独
- P1784 数独
- P1092 虫食算
- P2329 (SCOI2005)栅栏
- P1220 关路灯
- P2668 斗地主
- P1731 (NOI1999)生日蛋糕
- P1120 小木棍

[算法总结]DFS(深度优先搜索)的更多相关文章
- 回溯算法 DFS深度优先搜索 (递归与非递归实现)
回溯法是一种选优搜索法(试探法),被称为通用的解题方法,这种方法适用于解一些组合数相当大的问题.通过剪枝(约束+限界)可以大幅减少解决问题的计算量(搜索量). 基本思想 将n元问题P的状态空间E表示成 ...
- HDU 1241 Oil Deposits DFS(深度优先搜索) 和 BFS(广度优先搜索)
Oil Deposits Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total ...
- HDU 4707 Pet(DFS(深度优先搜索)+BFS(广度优先搜索))
Pet Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submissio ...
- 【算法入门】深度优先搜索(DFS)
深度优先搜索(DFS) [算法入门] 1.前言深度优先搜索(缩写DFS)有点类似广度优先搜索,也是对一个连通图进行遍历的算法.它的思想是从一个顶点V0开始,沿着一条路一直走到底,如果发现不能到达目标解 ...
- 回溯 DFS 深度优先搜索[待更新]
首先申明,本文根据微博博友 @JC向北 微博日志 整理得到,本文在这转载已经受作者授权! 1.概念 回溯算法 就是 如果这个节点不满足条件 (比如说已经被访问过了),就回到上一个节点尝试别 ...
- 『ACM C++』HDU杭电OJ | 1416 - Gizilch (DFS - 深度优先搜索入门)
从周三课开始总算轻松了点,下午能在宿舍研究点题目啥的打一打,还好,刚开学的课程还算跟得上,刚开学的这些课程也是复习以前学过的知识,下半学期也不敢太划水了,被各种人寄予厚望之后瑟瑟发抖,只能努力前行了~ ...
- 步步为营(十五)搜索(一)DFS 深度优先搜索
前方大坑预警! 先讲讲什么是搜索吧. 有一天你去一个果园摘梨子,果农告诉你.有一棵树上有一个金子做的梨子,找到就是你的,你该怎么找? 地图例如以下: S 0 0 0 0 0 0 0 0 0 0 0 0 ...
- DFS——深度优先搜索的一般格式
DFS是一种深度优先的搜索思想,运用递归完成搜索,本质上也算是穷举思想的一类,可以通过剪枝进行优化. DFS的核心是回溯和递归, 如果以迷宫为例,一般会指定走各个方向的顺序(例如先左再上再右再下).从 ...
- ytu 1980:小鼠迷宫问题(DFS 深度优先搜索)
小鼠迷宫问题 Time Limit: 2 Sec Memory Limit: 64 MB Submit: 1 Solved: 1 [Submit][Status][Web Board] Desc ...
随机推荐
- redis相关命令及应用场景
Redis的应用场景 (1) 配合关系型数据库做高速缓存 l 高频次,热门访问的数据,降低数据库IO l 高频次,热门访问的数据,降低数据库IO (2) 由于其拥有 ...
- 数据库-第三章 关系数据库标准语言SQL-3.3 数据查询
数据查询 例: 一.单表查询 1.定义 是指仅涉及一个表的查询 2.选择表中的若干列 查询指定列 例: 查询全部列 例: 查询经过计算的值 例: 3.选择表中的若干元组 消除取值重复的行 例: 查询满 ...
- hdu2612 又是迷宫系列
题目链接:http://icpc.njust.edu.cn/Problem/Hdu/2612/ 题意:有两个人在地图上不同的位置,地图上由若干个餐厅,求两人能同时到达一个餐厅所用最少的总时间. 代码如 ...
- Linux下MySQL的数据库安装
centos7 + mysql5.7 tar包解压安装 先执行wget https://dev.mysql.com//Downloads/MySQL-5.7/mysql-5.7.18-linux-gl ...
- iOS URL schemes
来源:知乎 launch center pro支持的参数主要有两个,[prompt]文本输入框和[clipboard]剪贴板 淘宝宝贝搜索 taobao://http://s.taobao.com/? ...
- OpenCV-Python 理解SVM | 五十五
目标 在这一章中 我们将对SVM有一个直观的了解 理论 线性可分数据 考虑下面的图像,它具有两种数据类型,红色和蓝色.在kNN中,对于测试数据,我们用来测量其与所有训练样本的距离,并以最小的距离作为样 ...
- 从DeepNet到HRNet,这有一份深度学习“人体姿势估计”全指南
从DeepNet到HRNet,这有一份深度学习"人体姿势估计"全指南 几十年来,人体姿态估计(Human Pose estimation)在计算机视觉界备受关注.它是理解图像和视频 ...
- 震惊!程序员的福音!不需要敲代码就能完成复杂的逻辑应用? —— Azure Logic App
(大家看完标题可能以为是营销号,哈哈哈哈哈哈哈哈哈...客官请留步, 正经博主....好吧) 今天我们的主题是Azure Logic Apps Azure Logic Apps 是什么? 官方解释:h ...
- 面试刷题26:新冠攻击人类?什么攻击java平台?
可恶的新冠病毒攻击人类,搞得IT就业形势相当不好?好在有钟南山院士带领我们提前开展好了防护工作! java作为基础平台安装在各种移动设备,PC,小型机,分布式服务器集群,各种不同的操作系统上.所以,对 ...
- qq,新浪分享
var _title,_source,_sourceUrl,_pic,_showcount,_desc,_summary,_site; // 新浪微博分享$('.xlwb-share').on('cl ...