搜索(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为障碍物. ...
随机推荐
- 【Redis】Cluster集群
一.Redis Cluster 工作原理 在引入哨兵机制后,解决了Redis主从架构Master故障时的主从切换问题,保证了Redis服务可用性.但依旧无法解决单机节点出现的写入性能瓶颈(网卡速率.单 ...
- Vue2积分商城项目
一.清空项目非必要文件和用户片段,路径提示的配置 views 下面的文件只保留 Home.vue ,其余删除,删除 components/HelloWorld.vue,并且 Home.vue 中不再引 ...
- 2023-04-04:使用 Golang 和 ffmpeg-go 库实现 demuxing_decoding.c,轻松掌握音视频分离解码技巧。
2023-04-04:使用 Golang 和 ffmpeg-go 库实现 demuxing_decoding.c,轻松掌握音视频分离解码技巧. 答案2023-04-05: 使用github/moonf ...
- pgadmin数据输出不存在了?
菜单栏→文件→重置布局.这样数据输出就显示了.
- 2022-11-15:这里有 n 个航班,它们分别从 1 到 n 进行编号。 有一份航班预订表 bookings , 表中第 i 条预订记录 bookings[i] = [firsti, lasti,
2022-11-15:这里有 n 个航班,它们分别从 1 到 n 进行编号. 有一份航班预订表 bookings , 表中第 i 条预订记录 bookings[i] = [firsti, lasti, ...
- Python忽略NoData计算多张遥感影像的像元平均值:whitebox库
本文介绍基于Python中whitebox模块,对大量长时间序列栅格遥感影像的每一个像元进行忽略NoData值的多时序平均值求取. 在文章Python ArcPy批量计算多时相遥感影像的各像元 ...
- vue全家桶进阶之路20:ECMAScript脚本语言规范
ECMAScript(简称 ES)是一种由 Ecma 国际组织定义的脚本语言标准,它定义了 JavaScript 语言的基本规范和特性.JavaScript 是一种基于 ECMAScript 标准的编 ...
- 如何在Docker Compose中限制容器的CPU和内存使用?
最近我在使用开源统计Umami过程中,发现CPU和内存经常占满,导致其它服务都不能正常使用.Umami我使用的docker-compose进行部署,于是打算使用docker-compose限制下容器的 ...
- 聊聊Mybatis的实现原理
使用示例 平时我们使用的一般是集成了Spring或是Spring Boot的Mybatis,封装了一层,看源码不直接:如下,看看原生的Mybatis使用示例 示例解析 通过代码可以清晰地看出,MyBa ...
- vue平铺日历组件之按住ctrl、shift键实现跨月、跨年多选日期的功能
已经好久没有更新过博客了,大概有两三年了吧,因为换了工作,工作也比较忙,所以也就没有时间来写技术博客,期间也一直想写,但自己又比较懒,就给耽误了.今天这篇先续上,下一篇什么时候写,我也不知道,随心所欲 ...