深搜DFS
含义
- 从搜索起点开始,一直访问邻居节点
- DFS一般都是递归,先一层层递归进去,然后一层层出来......反复搜到最后一层
- BFS一般是用栈,搜完一层,进入下一层,一直搜到最后一层
常见所需元素
- 递归
- 状态
- 状态转移
- 搜索成功的判断
- 遍历邻居节点
模板(自创)
void DFS(T xxx,状态1){
if(f(xxx)...){ //递归出口
cout<<结果
return;
}
DFS(T xxx,状态2=状态1+x);
cout<<没搜到 或者 直接结束
return;
}
优化
- 优化主要是剪枝,考虑题目实际意思、边界情况等,有些搜过的,不可能符合要求的情况就不搜了
例题
- 神奇的口袋(北大复试,这题dp也能做,其实就是subset sum):http://t.cn/Ai0u0GUz
- 碎纸机:http://noi.openjudge.cn/ch0205/1805/
- 八皇后:https://www.nowcoder.com/practice/fbf428ecb0574236a2a0295e1fa854cb