搜索(DFS/BFS)
广度优先搜索(BFS)
基本要点:
- 利用队列(先进先出)
- 一层一层搜索
- 适合于连通块的搜索
- 任何的BFS都可以转化为对树的广搜
基本流程:
- 选择搜索的起点,起点入队,起点标记为已访问
- 队列非空时,循环出队,每次出队将与出队元素连通的且未访问过的元素依次入队,并标记为已访问
基础模板:
void DFS(int x,int y){
q.push(start);
vis[start] = 1;
while(!q.empty()){
int x = q.front();
q.pop();
for(所有与x联通的y){
if(vis[y] == 0){
q.push(y); vis[y] = 1;
}
}
}
}
题型归纳:
- [[Luogu P1451 求细胞数量]]
- [[Luogu P1162 填涂颜色]]
- [[Luogu P1443 马的遍历]]
- [[Luogu P3958 奶酪]]
- 题型总结:邻接条件一般是:1.增量数组(上下左右) 2.邻接矩阵(是否有边相连)
深度优先搜索(DFS)
基本要点:
- 通常用于解决最大/最长路径或者穷举所有可能的问题
- 用递归来实现
- 一条路走到黑
- 任何的DFS都可以转化为对树的深搜
基本流程:
- 选择一个起点进入DFS搜索
- 对于当前阶段/节点有多种处理决策,选择第一个决策,然后DFS下一个阶段
- 当第一个决策执行完毕后回溯,执行下一个决策
-
基础模板:
//非回溯版
void DFS(int x,int y){
cnt++;//用于记录遍历的节点数的变量
vis[x][y] = 1;//在DFS内部标记已访问不用回溯
for(int i = 1; i < 4; ++ i){
int nx = x + dx[i];
int ny = y + dy[i];
if(nx >= 1 && nx <= n && ny >= 1 && ny <= n && vis[nx][ny] == 0)
DFS(nx,ny);
}
}
//回溯版
void DFS(int x,int y){
cnt++;//用于记录遍历的节点数的变量
for(int i = 1; i < 4; ++ i){
int nx = x + dx[i];
int ny = y + dy[i];
if(nx >= 1 && nx <= n && ny >= 1 && ny <= n && vis[nx][ny] == 0){
vis[nx][ny] = 1;
DFS(nx,ny);
vis[nx][ny] = 0;//在DFS外部标记已访问要回溯
}
}
}
题型归纳:
- [[Luogu B3625 迷宫寻路]]
- [[Luogu P1706 全排列问题]]
- [[Luogu P4017 最大食物链计数]]
- [[Luogu P1219 八皇后]]
搜索剪枝优化:
- 记忆化搜索:
- 基本要点:
- 添加一个记忆化数组,对访问过的元素标记,避免重复访问
- 一般在递归函数中使用,当当前元素已经访问过时,直接返回值,跳过对该元素的处理
- 多用于动态规划的过程 - 基础模板:
int g[MAXN]; // 定义记忆化数组
int ans = 最坏情况, now;
void dfs f(传入数值) {
if (g[规模] != 无效数值) return; // 或记录解,视情况而定
if (到达目的地) ans = 从当前解与已有解中选最优; // 输出解,视情况而定
for (遍历所有可能性)
if (可行) {
进行操作;
dfs(缩小规模);
撤回操作;
}
}
int main() {
// ...
memset(g, 无效数值, sizeof(g)); // 初始化记忆化数组
// ...
}
- 题型归纳:
[[Luogu P4017 最大食物链计数]]
- 基本要点:
- 最优性剪枝:
- 基本要点:
- 在搜索中导致运行慢的原因还有一种,就是在当前解已经比已有解差时仍然在搜索,那么我们只需要判断一下当前解是否已经差于已有解。 - 基础模板:
int ans = 最坏情况, now;
void dfs(传入数值) {
if (now比ans的答案还要差) return;
if (到达目的地) ans = 从当前解与已有解中选最优;
for (遍历所有可能性)
if (可行) {
进行操作;
dfs(缩小规模);
撤回操作;
}
}
- 基本要点:
- 可行性剪枝:
- 基本要点:
-在搜索过程中当前解已经不可用了还继续搜索下去也是运行慢的原因。 - 基础模板:
int ans = 最坏情况, now;
void dfs(传入数值) {
if (当前解已不可用) return;
if (到达目的地) ans = 从当前解与已有解中选最优;
for (遍历所有可能性)
if (可行) {
进行操作;
dfs(缩小规模);
撤回操作;
}
}
- 基本要点:
- 记忆化搜索:
搜索(DFS/BFS)的更多相关文章
- POJ 2243 简单搜索 (DFS BFS A*)
题目大意:国际象棋给你一个起点和一个终点,按骑士的走法,从起点到终点的最少移动多少次. 求最少明显用bfs,下面给出三种搜索算法程序: // BFS #include<cstdio> #i ...
- 搜索进阶课件,视频,代码(状态压缩搜索,折半搜索,dfs,bfs总结)
链接:https://pan.baidu.com/s/1-svffrprCOO4CtQoCTQ9hQ 提取码:h909 复制这段内容后打开百度网盘手机App,操作更方便哦
- 深度优先搜索DFS和广度优先搜索BFS简单解析(新手向)
深度优先搜索DFS和广度优先搜索BFS简单解析 与树的遍历类似,图的遍历要求从某一点出发,每个点仅被访问一次,这个过程就是图的遍历.图的遍历常用的有深度优先搜索和广度优先搜索,这两者对于有向图和无向图 ...
- 深度优先搜索(DFS)与广度优先搜索(BFS)的Java实现
1.基础部分 在图中实现最基本的操作之一就是搜索从一个指定顶点可以到达哪些顶点,比如从武汉出发的高铁可以到达哪些城市,一些城市可以直达,一些城市不能直达.现在有一份全国高铁模拟图,要从某个城市(顶点) ...
- 利用广度优先搜索(BFS)与深度优先搜索(DFS)实现岛屿个数的问题(java)
需要说明一点,要成功运行本贴代码,需要重新复制我第一篇随笔<简单的循环队列>代码(版本有更新). 进入今天的主题. 今天这篇文章主要探讨广度优先搜索(BFS)结合队列和深度优先搜索(DFS ...
- 深度优先搜索(DFS)和广度优先搜索(BFS)
深度优先搜索(DFS) 广度优先搜索(BFS) 1.介绍 广度优先搜索(BFS)是图的另一种遍历方式,与DFS相对,是以广度优先进行搜索.简言之就是先访问图的顶点,然后广度优先访问其邻接点,然后再依次 ...
- 深度优先搜索DFS和广度优先搜索BFS简单解析
转自:https://www.cnblogs.com/FZfangzheng/p/8529132.html 深度优先搜索DFS和广度优先搜索BFS简单解析 与树的遍历类似,图的遍历要求从某一点出发,每 ...
- Leetcode之深度+广度优先搜索(DFS+BFS)专题-934. 最短的桥(Shortest Bridge)
Leetcode之广度优先搜索(BFS)专题-934. 最短的桥(Shortest Bridge) BFS入门详解:Leetcode之广度优先搜索(BFS)专题-429. N叉树的层序遍历(N-ary ...
- hdu 1254 推箱子(嵌套搜索,bfs中有dfs)
推箱子 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...
- 深度优先搜索(DFS)和广度优先搜索(BFS)求解迷宫问题
用下面这个简单的迷宫图作为例子: OXXXXXXX OOOOOXXX XOXXOOOX XOXXOXXO XOXXXXXX XOXXOOOX XOOOOXOO XXXXXXXO O为通路,X为障碍物. ...
随机推荐
- Pytorch数据操作
1.Pytorch中tensor的生成与访问 可以使用arange()创建一个张量:如,torch.arange(12)创建0开始的前12个整数: 除非特殊指定,否则新的张量将存放在内存中,并采用CP ...
- 【Visual Leak Detector】源码调试 VLD 库
说明 使用 VLD 内存泄漏检测工具辅助开发时整理的学习笔记.本篇介绍 VLD 源码的调试.同系列文章目录可见 <内存泄漏检测工具>目录 目录 说明 1. VLD 库源码调试步骤 1.1 ...
- Wolai 使用教程:嵌入小组件库,打造精美、强大的知识库主页
Wolai /我来云笔记在 2022.7.11 日的更新中,支持嵌入包括 NotionPet.芦笋.Replit 等在内的第三方应用.感谢 Wolai 云笔记官方对于 NotionPet 的支持. 趁 ...
- celery+Rabbit MQ简单的Demo
介绍 一个简单的celery + rabbitmq 的搭建例子,用于记录 Celery 异步处理框架, 安装命令 pip install celery RabbitMQ 消息中间件,用来做队列 安装配 ...
- selenium IDE插件的配置使用
开头 Selenium提供了一个可以自动录制脚本的插件 叫selenium IDE 让我们一起看看如何安装使用 安装 因为google扩展商城大多数人用不了,所以我们选用的是edag来下载seleni ...
- 2022-08-25:以下go语言代码输出什么?A:1 0;B:1 2;C:不能编译;D:0 0。 package main import “fmt“ func named() (n, _ int
2022-08-25:以下go语言代码输出什么?A:1 0:B:1 2:C:不能编译:D:0 0. package main import "fmt" func named() ( ...
- 2021-05-09:给定数组hard和money,长度都为N;hard[i]表示i号的难度, money[i]表示i号工作的收入;给定数组ability,长度都为M,ability[j]表示j号人的
2021-05-09:给定数组hard和money,长度都为N:hard[i]表示i号的难度, money[i]表示i号工作的收入:给定数组ability,长度都为M,ability[j]表示j号人的 ...
- Node 调试利器,前端、Node 开发必备 - VSCode JS Debug Terminal
经常看到有同学抱怨 Node 调试麻烦或者是搞不清怎么调试各种脚本.Jest.Webpack 等等,而偶尔看到的调试相关的文章又全都是在写 inspect.launch.json 这些方案,其实有一定 ...
- lec-6-Actor-Critic Algorithms
从PG→Policy evaluation 更多样本的均值+Causality+Baseline 减少variance 只要拟合估计Q.V:这需要两个网络 Value function fitting ...
- [SWPUCTF 2021 新生赛]PseudoProtocols
[SWPUCTF 2021 新生赛]PseudoProtocols 一.题目 二.WP 1.打开题目,发现提示我们是否能找到hint.php,并且发现URL有参数wllm.所以我们尝试利用PHP伪协议 ...