DAY65: 图论入门797、200、695

深度优先搜索

深度优先搜索按照一个方向一直搜索直到截止,再回溯换搜索方向。

  • 搜索方向,是认准一个方向搜,直到碰壁之后再换方向
  • 换方向是撤销原路径,改为节点链接的下一个路径,回溯的过程

因为需要回溯,所以一般使用递归的方式。其实在二叉树章节,对节点的搜索就涉及到了深度和广度优先搜索。基本的框架为

void dfs(参数) {if (终止条件) {存放结果;return;}for (选择:本节点所连接的其他节点) {处理节点;dfs(图,选择的节点); // 递归回溯,撤销处理结果}
}

基本步骤

  • 确定递归函数和参数
  • 确认终止条件
  • 处理目前搜索节点出发的路径

Leetcode: 797 所有可能的路径

1、确认递归函数,参数

dfs函数需要输入一个图,还要目前我们遍历的节点作为输入。

2、确认终止条件

当目前遍历的节点 为 最后一个节点的时候,就找到了一条,从 出发点到终止点的路径。也就是x== graph.size()-1;

3、当前节点的逻辑

先找到x节点graph[x][i]链接到其他那些节点,将选中的节点加入到路径中去。然后撤销路径,回溯。

class Solution {
private:vector<vector<int>> result;vector<int> path;void dfs(vector<vector<int>>& graph, int x){if(x == graph.size() - 1){result.push_back(path);return;}for(int i = 0; i < graph[x].size(); i++){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一圈一圈的遍历。仅仅需要一个容器,能保存我们要遍历过的元素就可以,那么用队列,还是用栈,甚至用数组,都是可以的。

用队列的话,就是保证每一圈都是一个方向去转,例如统一顺时针或者逆时针。

如果用栈的话,就是第一圈顺时针遍历,第二圈逆时针遍历,第三圈有顺时针遍历。

一般习惯用队列来实现。

Leetcode: 200. 岛屿数量

如果走过(加入队列),就需要标记已经经过。

代码如下,具体思路看代码就能懂,特别需要注意复杂代码的写法。

class Solution {
private:int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1};//定义四个方向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();for(int i = 0; i < 4; i++){int nextx = cur.first + dir[i][0];int nexty = cur.second + dir[i][1];if(nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue;if(!visited[nextx][nexty] && grid[nextx][nexty] == '1'){//如果没有遇到障碍物或者没有走到过que.push({nextx, nexty});visited[nextx][nexty] = true;}}}} public:int numIslands(vector<vector<char>>& grid) {int n = grid.size(), m = grid[0].size();//定义行和列vector<vector<bool>> visited(n, vector<bool>(m, false));//定义遍历过的状态记录数组int result = 0;for(int i = 0; i < n; i++){for(int j = 0; j < m; j++){if(!visited[i][j] && grid[i][j] == '1'){result++;bfs(grid, visited, i, j);}}}return result;}
};

用深度优先搜索也能解决这道题目

class Solution {
private:int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1}; // 四个方向void dfs(vector<vector<char>>& grid, vector<vector<bool>>& visited, int x, int y) {for (int i = 0; i < 4; i++) {int nextx = x + dir[i][0];int nexty = y + dir[i][1];if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue;  // 越界了,直接跳过if (!visited[nextx][nexty] && grid[nextx][nexty] == '1') { // 没有访问过的 同时 是陆地的visited[nextx][nexty] = true; dfs(grid, visited, nextx, nexty);} }}
public:int numIslands(vector<vector<char>>& grid) {int n = grid.size(), m = grid[0].size();vector<vector<bool>> visited = vector<vector<bool>>(n, vector<bool>(m, false)); int result = 0;for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {if (!visited[i][j] && grid[i][j] == '1') { visited[i][j] = true;result++; // 遇到没访问过的陆地,+1dfs(grid, visited, i, j); // 将与其链接的陆地都标记上 true}}}return result;}
};

Leetcode: 695 岛屿的最大面积

这道题和上道题的思想是相似的。但是不同的是这次是计算岛屿的面积,我们遇到岛屿的时候,使用深度优先搜索来计算,搜索的次数就是岛屿的面积。代码如下:

class Solution {
private:int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1}; // 四个方向int count;void dfs(vector<vector<int>>& grid, vector<vector<bool>>& visited, int x, int y) {for (int i = 0; i < 4; i++) {int nextx = x + dir[i][0];int nexty = y + dir[i][1];if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue;  // 越界了,直接跳过if (!visited[nextx][nexty] && grid[nextx][nexty] == 1) { // 没有访问过的 同时 是陆地的visited[nextx][nexty] = true; count++;dfs(grid, visited, nextx, nexty);} }}
public:int maxAreaOfIsland(vector<vector<int>>& grid) {int n = grid.size(), m = grid[0].size();vector<vector<bool>> visited = vector<vector<bool>>(n, vector<bool>(m, false)); int result = 0;for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {if (!visited[i][j] && grid[i][j] == 1) { visited[i][j] = true;count = 1;dfs(grid, visited, i, j); // 将与其链接的陆地都标记上 trueresult = max(result, count);}}}return result;}
};

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

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

相关文章

【STM32】STM32学习笔记-独立看门狗和窗口看门狗(47)

00. 目录 文章目录 00. 目录01. WDG概述02. 独立看门狗相关API2.1 IWDG_WriteAccessCmd2.2 IWDG_SetPrescaler2.3 IWDG_SetReload2.4 IWDG_ReloadCounter2.5 IWDG_Enable2.6 IWDG_GetFlagStatus2.7 RCC_GetFlagStatus 03. 独立看门狗接线图04. 独立看门狗程序示例105. 独立看门…

简单排列组合题(python版)

文章预览&#xff1a; 题目解法一输出结果 解法二输出结果输出结果 题目 有四个数字:1,2,3,4能组成多少个互不相同且无重复的数字的三位数? 各式多少? 解法一 我们粗略看一下这个题既然我们要组成三位数&#xff0c;那我们就循环3层每一层出一个数&#xff0c;并且if语句判…

OD(12)之Mermaid思维导图(Mindmap)

OD(12)之Mermaid思维导图(Mindmap)使用详解 Author: Once Day Date: 2024年2月29日 漫漫长路才刚刚开始… 全系列文章可参考专栏: Mermaid使用指南_Once_day的博客-CSDN博客 参考文章: 关于 Mermaid | Mermaid 中文网 (nodejs.cn)Mermaid | Diagramming and charting tool…

postman传参与返回值切换为左右显示的操作

目录 第一步 点击“Settings”&#xff0c;在下拉框选择“Settings” 第二步 在默认打开的General页面&#xff0c;参照下图改动两处 第一步 点击“Settings”&#xff0c;在下拉框选择“Settings” 第二步 在默认打开的General页面&#xff0c;参照下图改动两处 附上修改后…

字符串函数strstr()详解

一、strstr()函数的作用 字符串函数 strstr() 是 C 语言的一个标准库函数&#xff0c;它的作用是在一个字符串中查找给定字符串的第一个匹配之处&#xff0c;并返回指向该字符串的指针。如果没有找到该字符串&#xff0c;则返回 NULL。1 二、strstr()函数的原型和参数 strst…

c语言求奇数分之一序列前N项和

本题要求编写程序&#xff0c;计算序列 1 1/3 1/5 ... 的前N项之和。 输入格式: 输入在一行中给出一个正整数N。 输出格式: 在一行中按照“sum S”的格式输出部分和的值S&#xff0c;精确到小数点后6位。题目保证计算结果不超过双精度范围。 输入样例: 23输出样例: …

opencv中的rgb转gray的计算方法

转换原理 在opencv中&#xff0c;可以使用cv2.cvtColor函数将rgb图像转换为gray图像。示例代码如下&#xff0c; import cv2img_path "image.jpg" image cv2.imread(img_path) gray_image cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) mean gray_image.mean() pri…

【AI Agent系列】【MetaGPT多智能体学习】4. 基于MetaGPT的Team组件开发你的第一个智能体团队

本系列文章跟随《MetaGPT多智能体课程》&#xff08;https://github.com/datawhalechina/hugging-multi-agent&#xff09;&#xff0c;深入理解并实践多智能体系统的开发。 本文为该课程的第四章&#xff08;多智能体开发&#xff09;的第二篇笔记。主要是对MetaGPT中Team组件…

【Django】执行查询—检索对象

检索对象 检索全部对象 >>> all_entries Entry.objects.all()通过过滤器检索指定对象 通过添加过滤条件精炼原始 QuerySet。两种最常见的精炼 QuerySet 的方式是&#xff1a; filter(**kwargs) 返回一个新的 QuerySet&#xff0c;包含的对象满足给定查询参数。 ex…

【Tomcat】在 linux 上实现 Catlina.log 自动分割,防止文件过大

背景描述 catalina.out即标准输出和标准出错&#xff0c;所有输出到这两个位置的都会进入catalina.out&#xff0c;这里包含tomcat运行自己输出的日志以及应用里向console输出的日志。默认这个日志文件是不会进行自动切割的&#xff0c;所以我们需要借助其他工具进行切割&…

MySQL:快照读和当前读

mysql读取数据实际上有两种读取模式&#xff1a;当前读和快照读 快照读&#xff1a;快照读的执行方式是生成 ReadView&#xff0c;直接利用 MVCC 机制来进行读取&#xff0c;并不会对记录进行加锁。当前读&#xff1a;每次读取的都是当前最新的数据&#xff0c;但是读的时候不…

剑指offer面试题22 栈的压入弹出序列

考察点 辅助栈知识点 题目 分析 这道题目要求输入俩个序列&#xff0c;第一个序列表示栈的压入顺序&#xff0c;要求判断第二个序列是否是该栈的弹出顺序。遇到这类题目思维一定要往辅助栈上靠&#xff0c;因为关于栈的考点其实就是这个。这种题目的解题思路就是归纳&#x…

「Python系列」Python pyecharts模块

文章目录 一、pyecharts安装二、pyecharts应用三、pyecharts图表类型四、pyecharts特点与功能特点&#xff1a;功能&#xff1a; 五、相关链接 一、pyecharts安装 要安装 Python 的 pyecharts 模块&#xff0c;你可以使用 pip&#xff0c;这是 Python 的包管理工具。请按照以下…

Payment Without Change

题目链接&#xff1a;Problem - 1256A - Codeforces 解题思路&#xff1a; 题目的大致意思就是手中的硬币数拿出若干枚正好等于s&#xff0c;分三种情况 .如果n > s && b < s,输出no .如果b > s,输出yes .如果n * (a < (s / n) ? a : (s / n)) b >…

数据结构(C语言版)02---链表

链表&#xff1a; 声明&#xff1a;LNode* LinkList在链表里面这两个是等价的; #include<stdio.h> #include<stdlib.h> typedef int Elemtype; typedef struct LNode{Elemtype data;struct LNode* next; }LNode,*LinkList; 链表打印函数&#xff1a; //打印v…

【iOS ARKit】RealityKit 同步机制

协作 Session 可以很方便地实现多用户之间的AR体验实时共享&#xff0c;但开发者需要自行负责并确保AR场景的完整性&#xff0c;自行负责虚拟物体的创建与销毁。为简化同步操作&#xff0c;RealityKit 内建了同步机制&#xff0c;RealityKit 同步机制基于 Multipeer Connectivi…

Python标准库sys常用函数、方法及代码实战解析【第108篇—标准库sys常用函数】

Python标准库sys常用函数、方法及代码实战解析 在Python的标准库中&#xff0c;sys 模块是一个常用而强大的工具&#xff0c;它提供了与Python解释器交互的函数和变量。本文将介绍sys模块的一些常用函数和方法&#xff0c;并通过实际的代码实例来解析它们的用法。 1. sys.argv…

C语言统计文件夹下所有文件数量/C语言删除文件夹下所有文件

代码解法不唯一&#xff0c;欢迎在评论区留下你的实现方式和想法&#xff0c;我会将好的解法更新到文章中&#xff01;&#xff01; 在C语言中&#xff0c;可以使用标准库中的函数来完成对文件夹中文件数量的判断和删除操作。下面是使用POSIX标准的代码示例&#xff0c;这段代…

Kafka是如何防止消息丢失的

Kafka通过一系列机制来防止消息丢失&#xff0c;主要包括以下几个方面&#xff1a; 生产者端&#xff08;Producer&#xff09;保证&#xff1a; 同步发送&#xff1a;生产者默认是异步发送消息的&#xff0c;但如果希望保证消息不丢失&#xff0c;可以选择将异步发送改为同步…

2024.2.19

1.TCP模型 服务器端 #include <myhead.h> #define SER_IP "192.168.199.129" #define SER_PORT 8899int main(int argc, const char *argv[]) {//1.创建用于连接的套接字文件int sfdsocket(AF_INET,SOCK_STREAM,0);if(sfd-1){perror("socket error"…