图论第一天|深度优先搜索理论基础、广度优先搜索理论基础、797.所有可能的路径

深度优先搜索理论基础

文档讲解 :

  1. 代码随想录 - 深度优先搜索理论基础
  2. Hello 算法 9.3 图的遍历

状态:开始学习。

dfs(深度优先搜索)与bfs(广度优先搜索)区别

  • dfs是可一个方向去搜,不到黄河不回头,直到遇到绝境了,搜不下去了,再换方向(换方向的过程就涉及到了回溯)。(实现机制类似后入先出
  • bfs是先把本节点所连接的所有节点遍历一遍,走到下一个节点的时候,再把连接节点的所有节点遍历一遍,搜索方向更像是广度,四面八方的搜索过程。(实现机制类似队列先入先出
    区别

dfs搜索过程

深度优先遍历是一种优先走到底、无路可走再回头的遍历方式。
dfs搜索过程

dfs三部曲

  1. 确认递归函数,参数
    vector<vector<int>> result; // 保存符合条件的所有路径
    vector<int> path; // 起点到终点的路径
    void dfs (图,目前搜索的节点)  
    
  2. 确定终止条件
    if (终止条件) {存放结果;return;
    }
    
  3. 处理目前搜索节点出发的路径
    for (选择:本节点所连接的其他节点) {处理节点;dfs(图,选择的节点); // 递归回溯,撤销处理结果
    }
    

广度优先搜索理论基础

文档讲解 :

  1. 代码随想录 - 广度优先搜索理论基础
  2. Hello 算法 9.3 图的遍历

状态:开始学习。

bfs的使用场景

广搜的搜索方式就适合于解决两个点之间的最短路径问题。

bfs搜索过程

bfs

bfs代码框架

int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1}; // 表示四个方向
// grid 是地图,也就是一个二维数组
// visited标记访问过的节点,不要重复访问
// x,y 表示开始搜索节点的下标
void bfs(vector<vector<char>>& grid, vector<vector<bool>>& visited, int x, int y) {queue<pair<int, int>> que; // 定义队列que.push({x, y}); // 起始节点加入队列visited[x][y] = true; // 只要加入队列,立刻标记为访问过的节点while(!que.empty()) { // 开始遍历队列里的元素pair<int ,int> cur = que.front(); que.pop(); // 从队列取元素int curx = cur.first;int cury = cur.second; // 当前节点坐标for (int i = 0; i < 4; i++) { // 开始想当前节点的四个方向左右上下去遍历int nextx = curx + dir[i][0];int nexty = cury + dir[i][1]; // 获取周边四个方向的坐标if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue;  // 坐标越界了,直接跳过if (!visited[nextx][nexty]) { // 如果节点没被访问过que.push({nextx, nexty});  // 队列添加该节点为下一轮要遍历的节点visited[nextx][nexty] = true; // 只要加入队列立刻标记,避免重复访问}}}}

797.所有可能的路径

文档讲解 :代码随想录 - 797.所有可能的路径
状态:开始学习。

dfs

  1. 确认递归函数,参数
    vector<vector<int>> result; // 收集符合条件的路径
    vector<int> path; // 0节点到终点的路径
    // x:目前遍历的节点
    // graph:存当前的图
    void dfs (vector<vector<int>>& graph, int x) 
    
  2. 确认终止条件
    // 要求从节点 0 到节点 n-1 的路径并输出,所以是 graph.size() - 1
    if (x == graph.size() - 1) { // 找到符合条件的一条路径result.push_back(path); // 收集有效路径return;
    }
    
  3. 处理目前搜索节点出发的路径
    for (int i = 0; i < graph[x].size(); i++) { // 遍历节点n链接的所有节点path.push_back(graph[x][i]); // 遍历到的节点加入到路径中来dfs(graph, graph[x][i]); // 进入下一层递归path.pop_back(); // 回溯,撤销本节点
    }
    

本题代码(dfs):

class Solution {
private:vector<vector<int>> result; // 收集符合条件的路径vector<int> path; // 0节点到终点的路径// x:目前遍历的节点// graph:存当前的图void dfs (vector<vector<int>>& graph, int x) {// 要求从节点 0 到节点 n-1 的路径并输出,所以是 graph.size() - 1if (x == graph.size() - 1) { // 找到符合条件的一条路径result.push_back(path);return;}for (int i = 0; i < graph[x].size(); i++) { // 遍历节点n链接的所有节点path.push_back(graph[x][i]); // 遍历到的节点加入到路径中来dfs(graph, graph[x][i]); // 进入下一层递归path.pop_back(); // 回溯,撤销本节点}}
public:vector<vector<int>> allPathsSourceTarget(vector<vector<int>>& graph) {path.push_back(0); // 无论什么路径已经是从0节点出发dfs(graph, 0); // 开始遍历return result;}
};

bfs

本题代码(bfs):

class Solution {vector<vector<int>> result; // 收集符合条件的路径vector<int> path; // 0节点到终点的路径// graph:存当前的图// start: 起始路径void bfs(vector<vector<int>>& graph, vector<int> start) {queue<vector<int>> que; // 定义队列que.push(start); // 起始路径加入队列while (!que.empty()) { // 开始遍历队列里的元素;path = que.front(); // 从队列取元素(元素是路径)que.pop();int node = path.back(); //路径最后的节点if (node == graph.size() - 1) result.push_back(path); // 如果是最后一个节点,收集路径for (int i = 0; i < graph[node].size(); i++) { // 开始向图下一个节点遍历path.push_back(graph[node][i]); // 当前节点加入路径que.push(path); //搜索path.pop_back(); //回溯}}}
public:vector<vector<int>> allPathsSourceTarget(vector<vector<int>>& graph) {result.clear();path.clear();bfs(graph, {0});return result;}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/112324.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决Java应用程序中的SQLSyntaxErrorException:Unknown database错误

目录 问题背景 解决方案 问题背景 今天遇见一个这个问题&#xff0c;解决后发出来分享一下 MySQL数据库连接错误&#xff1a;Unknown database bookmanagement的修复方法&#xff1b;MySQL错误消息分析&#xff1a;Unknown database异常的解决 java.sql.SQLSyntaxErrorExce…

【深度学习实验】线性模型(五):使用Pytorch实现线性模型:基于鸢尾花数据集,对模型进行评估(使用随机梯度下降优化器)

目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 三、实验内容 0. 导入库 1. 线性模型linear_model 2. 损失函数loss_function 3. 鸢尾花数据预处理 4. 初始化权重和偏置 5. 优化器 6. 迭代 7. 测试集预测 8. 实验结果评估 9. 完整代码 一、实验介…

css自学框架之平滑滚动

今天添加的功能是平滑滚动到指定位置&#xff0c;就是单击页面的按钮&#xff0c;平滑滚动页面到对应的元素&#xff0c;可添加偏移值。 示例&#xff1a;单击ID为gundongBTN 元素&#xff0c;页面平滑滚动到其指定的ID为#topdiv对应内容&#xff0c;同时保留 5px 的偏移间距。…

网站降权的康复办法(详解百度SEO数据分析)

随着搜索引擎算法的不断升级&#xff0c;很多网站在SEO优化过程中遭遇到降权的情况。如果您的网站也遭遇到了类似的问题&#xff0c;不必惊慌失措。本文将为您详细介绍网站降权恢复的方法&#xff0c;包括百度SEO数据分析、网站收录少的5个原因、网站被降权的6个因素以及百度SE…

做了五年功能测试麻木了,现在想进阶自动化测试该从哪里开始?

什么是自动化测试&#xff1f; 做测试好几年了&#xff0c;真正学习和实践自动化测试一年&#xff0c;自我感觉这一个年中收获许多。一直想动笔写一篇文章分享自动化测试实践中的一些经验。终于决定花点时间来做这件事儿。 首先理清自动化测试的概念&#xff0c;广义上来讲&…

激光焊接汽车PP塑料配件透光率测试仪

随着汽车主机厂对车辆轻量化的需求越来越强烈&#xff0c;汽车零部件轻量化设计、制造也成为汽车零部件生产厂商的重要技术指标。零部件企业要实现产品的轻量化&#xff0c;在材料指定的情况下&#xff0c;要通过产品设计优化、产品壁厚减小和装配方式的优化来解决。使用PP材料…

Excel 拆分单元格数据(公式拆分、智能填充、分列)

将姓名工号拆分成 姓名 和 工号 方法1 在 B2 单元格输入 LEFT($A2, FIND(":", $A2) - 1)在 C2 单元格输入 RIGHT($A2, LEN($A2) - FIND(":", $A2))然后 ctrl d 向下填充即可 方法2 在 B2 单元格输入 李金秀&#xff0c;然后选中 B3 单元格&#xff0c…

【计算机网络】——数据链路层(应用:局域网、广域网、设备 )

//仅做个人复习和技术交流&#xff0c;图片取自王道考研&#xff0c;侵删 一、大纲 1、介质访问控制 信道划分介质访问控制 随机访问介质访问控制 2、局域网 3、广域网 4、数据链路层设备 二、局域网 1、局域网基本概念和体系结构 局域网(LocalArea Network): 简称LAN&…

动态内存管理(malloc、free、calloc、realloc函数简介)

动态内存管理 &#x1f383;为什么存在动态内存管理&#x1f383;动态内存函数的介绍&#x1f38a;malloc&#x1f38b;perror函数 &#x1f38a;free&#x1f38a;calloc&#x1f38a;realloc &#x1f383;为什么存在动态内存管理 在此之前&#xff0c;我们开辟内存空间有两种…

buuctf web [极客大挑战 2019]Secret File

纯网页&#xff0c;看一下源码。 这一块源码中有个隐藏的超链接&#xff0c;点击后跳转到了新页面。 新页面的源码里&#xff0c;也有一处可以跳转的超链接。 点进新页面啥也没有了。 单看网页&#xff0c;什么也没有&#xff0c;尝试用burp抓包试试。 在/Archive_room.php跳…

uniapp h5 echarts 打包后图表点击失效/及其他失效

文章目录 期望效果实际效果环境引入echarts方式解决方法&#xff1a;注意 原因多说一句在h5打包的时候将 history 改为 hash 不然在浏览器打开后刷新会404 期望效果 实际效果 环境 pc端 window11 hbuilderx版本 3.8.12 echarts版本 5.4.3 引入echarts方式 npm install echar…

如何在微软Edge浏览器上一键观看高清视频?

编者按&#xff1a;视频是当下最流行的媒体形式之一。但由于视频压缩、网络不稳定等原因&#xff0c;我们常常可以看到互联网上的很多视频其画面质量并不理想&#xff0c;尤其是在浏览器端&#xff0c;这极大地影响了观看体验。不过&#xff0c;近期微软 Edge 浏览器推出了一项…