广度优先搜索(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)的更多相关文章

  1. POJ 2243 简单搜索 (DFS BFS A*)

    题目大意:国际象棋给你一个起点和一个终点,按骑士的走法,从起点到终点的最少移动多少次. 求最少明显用bfs,下面给出三种搜索算法程序: // BFS #include<cstdio> #i ...

  2. 搜索进阶课件,视频,代码(状态压缩搜索,折半搜索,dfs,bfs总结)

    链接:https://pan.baidu.com/s/1-svffrprCOO4CtQoCTQ9hQ 提取码:h909 复制这段内容后打开百度网盘手机App,操作更方便哦

  3. 深度优先搜索DFS和广度优先搜索BFS简单解析(新手向)

    深度优先搜索DFS和广度优先搜索BFS简单解析 与树的遍历类似,图的遍历要求从某一点出发,每个点仅被访问一次,这个过程就是图的遍历.图的遍历常用的有深度优先搜索和广度优先搜索,这两者对于有向图和无向图 ...

  4. 深度优先搜索(DFS)与广度优先搜索(BFS)的Java实现

    1.基础部分 在图中实现最基本的操作之一就是搜索从一个指定顶点可以到达哪些顶点,比如从武汉出发的高铁可以到达哪些城市,一些城市可以直达,一些城市不能直达.现在有一份全国高铁模拟图,要从某个城市(顶点) ...

  5. 利用广度优先搜索(BFS)与深度优先搜索(DFS)实现岛屿个数的问题(java)

    需要说明一点,要成功运行本贴代码,需要重新复制我第一篇随笔<简单的循环队列>代码(版本有更新). 进入今天的主题. 今天这篇文章主要探讨广度优先搜索(BFS)结合队列和深度优先搜索(DFS ...

  6. 深度优先搜索(DFS)和广度优先搜索(BFS)

    深度优先搜索(DFS) 广度优先搜索(BFS) 1.介绍 广度优先搜索(BFS)是图的另一种遍历方式,与DFS相对,是以广度优先进行搜索.简言之就是先访问图的顶点,然后广度优先访问其邻接点,然后再依次 ...

  7. 深度优先搜索DFS和广度优先搜索BFS简单解析

    转自:https://www.cnblogs.com/FZfangzheng/p/8529132.html 深度优先搜索DFS和广度优先搜索BFS简单解析 与树的遍历类似,图的遍历要求从某一点出发,每 ...

  8. Leetcode之深度+广度优先搜索(DFS+BFS)专题-934. 最短的桥(Shortest Bridge)

    Leetcode之广度优先搜索(BFS)专题-934. 最短的桥(Shortest Bridge) BFS入门详解:Leetcode之广度优先搜索(BFS)专题-429. N叉树的层序遍历(N-ary ...

  9. hdu 1254 推箱子(嵌套搜索,bfs中有dfs)

    推箱子 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...

  10. 深度优先搜索(DFS)和广度优先搜索(BFS)求解迷宫问题

    用下面这个简单的迷宫图作为例子: OXXXXXXX OOOOOXXX XOXXOOOX XOXXOXXO XOXXXXXX XOXXOOOX XOOOOXOO XXXXXXXO O为通路,X为障碍物. ...

随机推荐

  1. mysql基础_事务

    定义 一个事务其实就是一个完整的业务逻辑,是一个最小的工作单元,不可再分,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败. 例如:王五向赵六的账户上转 ...

  2. nuxt.js项目中全局捕获异常并生成错误日志全过程

    需求:客户在使用过程中页面报错时,可以生成错误记录传回服务器,以便改进. 步骤: 一.全局捕获异常, 二.发送到服务端, 三.生成错误日志. 一.全局捕获异常 如图,vue提供了errorHandle ...

  3. 微信小程序客服、支付、定位、下拉加载功能

    一.客服功能 1.只要你微信小程序,后台添加了客服,引用以下button,就可以进入聊天(在小程序官网如何添加客服用户,请自行百度,谢谢) 2.通过按钮方式 <button open-type= ...

  4. 2022-11-13:以下go语言代码中,如何获取结构体列表以及结构体内的指针方法列表?以下代码应该返回{“S1“:[“M1“,“M2“],“S2“:[],“S3“:[“M1“,“M3“]},顺序不限

    2022-11-13:以下go语言代码中,如何获取结构体列表以及结构体内的指针方法列表?以下代码应该返回{"S1":["M1","M2"], ...

  5. 都说DevOps落地难,到底难在哪里?也许你还没找到套路

    当你打开这篇文章的时候,也许你也在为DevOps的落地而苦恼,也许你的组织正在尝试DevOps转型,作为一线的实践者,说说我对这个"落地难"的看法,欢迎交流不同看法- DevOps ...

  6. < Python全景系列-2 > Python数据类型大盘点

    <Python全景系列-2> Python数据类型大盘点 欢迎来到我们的系列博客<Python全景系列>!在这个系列中,我们将带领你从Python的基础知识开始,一步步深入到高 ...

  7. 初等数论——素数,逆元,EXGCD有关

    初等数论 素数定义 设整数 \(p\ne 0,\pm 1\) .如果 \(p\) 除了平凡约数以外没有其他约数,那么称 \(p\) 为素数(不可约数). 若整数 \(a\ne 0,\pm 1\) 且 ...

  8. .NET周报 【5月第4期 2023-05-27】

    国内文章 C#使用词嵌入向量与向量数据库为大语言模型(LLM)赋能长期记忆实现私域问答机器人落地之openai接口平替 https://www.cnblogs.com/gmmy/p/17430613. ...

  9. Simple Date Format类到底为啥不是线程安全的?

    摘要:我们就一起看下在高并发下Simple Date Format类为何会出现安全问题,以及如何解决Simple Date Format类的安全问题. 本文分享自华为云社区<[高并发]Simpl ...

  10. Ubuntu 对比 CentOS 后该如何选择?

    大家阅读完以上文章觉得如何选择更适合自己?欢迎留言哦~ 本文章转载自 Linux 就该这么学(ID: linuxprobe),文章图片与文字版权属源公众号所有,未经允许,禁止二次转载. 我要投稿 本公 ...