PS:看洛谷的运势写的,第一次写,欢迎补充与指导!
(但愿我写的这能很有文采)(笑
正片开始!
深搜!
背景和感悟:
2021年12月5日,我学习了深搜,这个小家伙的全名叫“深度优先搜索”,听起来很奇特,所以我也如水壶般被这一吨吨知识之水灌输着。
深搜,英文名dfs(Depth-First-Search),是C++及其常用的搜索方式,从英文名中,我就感到这是如同树根般,一直插入土壤笔直向下,直到触碰到岩浆才会停止返回,而再向另一个分支进行搜索。深搜的最基本的原理模式是栈和递归,起初我还没有完全理解,后来通过老师才得知是电脑在偷偷帮你用栈,好家伙,栈是我初赛最拿手的工具了,我便对深搜的原理有了一些认识。
原理:
“能搜则搜,不搜回溯”是dfs的基本运作流程之一,如下,这是一个无向图。
那么我们从X开始搜索,从X出发(这种方案并不唯一)卡死hi先从W方向搜索,也就是“X——>W——>L”到达L之后,无路可走,我们便需要回溯到X,再向Y方向开始搜索,也就是“X——>Y——>S(注意,深搜如同树干一样要一直往下伸到重复为止!)——>B——>Z——>M”到达M之后呢,再往下就又回到了X,于是终止搜索。自此,本次深搜就宣告结束;)
典型例题:
由原理,我们可以得出深搜模板,也就是那三件事:做什么事(哪条道),做下去(挖呀挖),回溯(返回原路);
由此,我们得出一道经典深搜模板题:luogP1657 选书:
#include<bits/stdc++.h>
using namespace std;
int