图论 之 DFS

文章目录

  • 1971.寻找图中是否存在路径
  • 797.所有可能的路径
  • 841.钥匙和房间

DFS的遍历的模版大差不差,主要是区别题目中的图是否是有环的?题目求解的是可达问题路径数量问题

  • 开始的时候,如果题目中的边的记录没有转化为邻接表的形式,那么就需要我们自己进行转化
  # 使用邻接表存储图adj = [[] for _ in range(n)]for u, v in edges:adj[u].append(v)adj[v].append(u)
  • 总体的遍历的模版
  # DFS 函数def dfs(i):if 终止条件return True# 如果需要标记,visited[i] = True  # 标记当前节点为已访问# 访问当前节点的邻居节点for neighbor in adj[i]:# 具体的操作# 返回return 

几类问题

  • 如果存在环的情况,一般要设置visited,不然会重复访问,当然,如果是有向无环图,就不用设置visited
  • 当你要记录一个节点是否被访问的时候,你就要设置这个visited
  • visited标记的更新的问题
def dfs(i):# 一般更新在外边visited[i] = True
  • 如何判断是否有环的问题?你可以记录当前节点的parent,当遇到一个新的已经访问的节点,并且该节点还不是父节点(感觉n>2才行)

1971.寻找图中是否存在路径

1971.寻找图中是否存在路径

在这里插入图片描述

思路分析:该题使用传统的DFS可以完成,当然使用并查集也可以完成.下面介绍使用dfs的做法

  • 使用dfs,首先为了方便起见,我们使用邻接表记录图中边的情况,注意使用的是邻接表,同时,我们应该开一个数组visited[i]用来记录节点i是否被访问过。递归的截止的条件是 i == destination,否则,我们首先将当前访问的节点标记为True,接着,我们访问i的邻居节点neighbor,如果邻居节点还没有被访问,我们就可以递归访问,当有一个节点返回True,我们就返回True,当访问完全部的节点都没有返回True,我们就返回True
from typing import Listclass Solution:def validPath(self, n: int, edges: List[List[int]], source: int, destination: int) -> bool:# 使用邻接表存储图adj = [[] for _ in range(n)]for u, v in edges:adj[u].append(v)adj[v].append(u)# 记录访问过的节点visited = [False] * n# DFS 函数def dfs(i):if i == destination:return Truevisited[i] = True  # 标记当前节点为已访问for neighbor in adj[i]:if not visited[neighbor]:if dfs(neighbor):return Truereturn False  # 所有路径都尝试过,未找到目标节点return dfs(source)

797.所有可能的路径

797.所有可能的路径

在这里插入图片描述

思路分析:求解的是方案数,我们需要传递两个参数,当前访问到的节点i和当前的路径存储path,注意,每次应该先把当前的节点加入path,然后进行判断是否到达n-1,如果没有,就访问邻居节点,否则就把path加入ans答案中,访问完邻居之后,就path.pop()弹出节点i

class Solution:def allPathsSourceTarget(self, graph: List[List[int]]) -> List[List[int]]:ans = []  # 存储所有路径n = len(graph)def dfs(i, path):# 将当前节点加入路径path.append(i)# 如果当前节点是目标节点,将路径加入结果if i == n - 1:ans.append(path.copy())  # 注意:这里需要传递 path 的副本# 遍历所有邻居节点for neighbor in graph[i]:dfs(neighbor, path)  # 递归调用# 回溯:移除当前节点path.pop()dfs(0, [])  # 从节点 0 开始 DFSreturn ans

841.钥匙和房间

841.钥匙和房间

在这里插入图片描述

思路分析:我们只要使用这个dfs进行遍历即可,通过判断访问的房间数是否等于n或者是否访问过全部的房间

class Solution:def canVisitAllRooms(self, rooms: List[List[int]]) -> bool:n = len(rooms)visited = [False] * n  # 记录房间是否被访问过def dfs(i):nonlocal num  # 使用 nonlocal 关键字修改外部变量visited[i] = True  # 标记当前房间为已访问num += 1  # 更新已访问的房间数量for neigh in rooms[i]:  # 访问邻居if not visited[neigh]:dfs(neigh)  # 递归访问未访问的房间num = 0  # 记录已访问的房间数量dfs(0)  # 从房间 0 开始访问return num == n  # 检查是否所有房间都被访问过

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

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

相关文章

《跟李沐学 AI》AlexNet论文逐段精读学习心得 | PyTorch 深度学习实战

前一篇文章,使用 AlexNet 实现图片分类 | PyTorch 深度学习实战 本系列文章 GitHub Repo: https://github.com/hailiang-wang/pytorch-get-started 本篇文章内容来自于学习 9年后重读深度学习奠基作之一:AlexNet【下】【论文精读】】的心得。 《跟李沐…

武汉火影数字|VR沉浸式空间制作 VR大空间打造

VR沉浸式空间制作是指通过虚拟现实技术创建一个逼真的三维环境,让用户能够沉浸在这个环境中,彷佛置身于一个全新的世界。 也许你会好奇,VR 沉浸式空间究竟是如何将我们带入那奇妙的虚拟世界的呢?这背后,离不开一系列关…

ARM-Linux 基础项目篇——简单的视频监控

该基础项目为后面的 AI 安防项目做铺垫。使用 Qt 的网络编程方案来实现,后期再实现流媒体协议的方案。使用 ov2640 摄像头。 一、实现流程 (1) 服务器采集摄像头的数据。 (2) 处理视频数据转交给 Socket,…

使用Selenium进行网页自动化

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 Selenium是一个流行的Web自动化测试框架,它支持多种编程语言和浏览器,并提供了丰富的API和工具来模拟用户在浏览器中的行为。Selenium可以通…

网络技术变迁:从IPv4走向IPv6

目录 前言 旧时代产物:IPv4 什么是IPv4? IPv4的工作方式 IPv4的缺点 为什么要从IPv4过渡到IPv6? 走向IPv6:新一代互联网协议 IPv6的技术特性 我们需要过渡技术 双栈(Dual Stack) 隧道技术&#…

AI交互数字人:定向知识库,大语言模型构建AI数字人“智慧大脑”

2025年年初,杭州深度求索推出的 开源大语言模型横空出世,犹如一枚重磅炸弹投入市场,迅速引发了广泛关注。它不仅在国内掀起了讨论热潮,更是凭借强的影响力,成功冲击了美国AI 市场,成为了 2025 年国内外瞩目…

用大内存主机下载Visual Studio

用一台内存达到128G的主机下载Visual Studio 2022,用的是公司网络。下载速度让我吃了一惊,没人用网络了?还是网站提速了?以前最大只能达到5MB/秒。记录这段经历,是用来分析公司网络用的......

DeepSeek操作Excel,实现图表自动化生成

案例 让DeepSeek操作Excel,实现图表自动化生成。我们只要用自然语言输入我们的需求(根据哪块单元格区域做什么图表),就可以直接在Excel中自动生成图表。 操作主界面和图表效果 设置接入方式 这里提供了多种接入方式将DeepSeek接…

DP-最长公共子序列

题面: 样例: 思路: 这里我们状态表示确实比较奇怪,两个序列用二维来表示比较好想,但是这个表示的意义就记住吧hhh。这里比较难想的是状态划分,既然我们想要用前面的来表示后面的(也就是说要用到…

DVWA-DOM型XSS全等级绕过方法

DOM型XSS全等级绕过 前言一、LOW级别二、Medium级别 图片插入语句法 三、High级别 字符 # 绕过服务端过滤 四、Impossible级别 前言 DOM,全称Document Object Model,是一个平台和语言都中立的接口,可以使程序和脚本能够动态访问和更新文档…

人工智能与自闭症的研究现状及未来趋势

人工智能与自闭症的研究现状及未来趋势 摘要:本研究旨在通过文献计量学方法,分析人工智能领域内关于自闭症研究的现状与未来趋势。研究基于中国知网(CNKI)、万方数据库(WanFang)、维普数据库(V…

zero自动化框架搭建---Git安装详解

一、Git下载 下载安装包 官网下载 下载的地址就是官网即可:Git - Downloads 进来直接选择windows的安装包下载 选择安装位置 双击安装包安装,选择安装地址后点击next 选择安装的组件,默认即可 也可按照需要自行选择 Windows Explorer i…

【精调】LLaMA-Factory 快速开始1: Meta-Llama-3.1-8B-Instruct

llamafactory-cli train examples/train_lora/llama3_lora_sft.yaml llamafactory-cli chat examples/inference/llama3_lora_sft.yaml llamafactory-cli export examples/merge_lora/llama3_lora_sft.yaml模型下载 git clone https://www.modelscope.cn/LLM-Research/Meta-Lla…

服务器创建conda环境并安装使用jupyter

1.创建conda环境 conda create --name myenv python3.8 conda activate myenv其中 myenv 是您想要创建的环境名称,可以根据需要替换为其他名称。2.安装juypter conda install jupyter3.启动juypter jupyter notebook复制链接到浏览器打开 4.设置jupyter使用的 …

树莓派 4B:AI 物联网完整部署方案

引言 人工智能(AI)和物联网(IoT)正在快速融合,使得智能监控、工业自动化、智能家居等场景变得更加智能化。树莓派 4B 作为一款低功耗、高性价比的嵌入式计算平台,可以运行 AI 模型,并结合 IoT …

JVM类文件结构深度解析:跨平台基石与字节码探秘

目录 一、类文件:Java生态的通用语言 1.1 字节码的桥梁作用 1.2 类文件核心优势 二、类文件二进制结构剖析 2.1 整体结构布局 2.2 魔数与版本控制 2.3 常量池:类文件的资源仓库 2.4 访问标志位解析 三、核心数据结构详解 3.1 方法表结构 3.2 …

亲测可用,IDEA中使用满血版DeepSeek R1!支持深度思考!免费!免配置!

作者:程序员 Hollis 之前介绍过在IDEA中使用DeepSeek的方案,但是很多人表示还是用的不够爽,比如用CodeChat的方案,只支持V3版本,不支持带推理的R1。想要配置R1的话有特别的麻烦。 那么,今天,给…

Java语法-集合

Java语法 Day19 晨考 Collections工具类 /* Collection 集合工具类 此类中的方法全部为静态方法 此类种提供了用于操作集合的各种方法swap(List<?> list,int i,int j) 交换指定位置的集合中的元素 sort(List<T> list,Comparator<? super T> c) 根…

网络缓存加速技术解析:从诞生到演进

目录 早期探索&#xff1a;浏览器缓存的出现 网络架构升级&#xff1a;代理服务器缓存的应用 全球化加速&#xff1a;CDN 缓存的崛起深入了解CDNhttps://blog.csdn.net/m0_68472908/article/details/145744082?spm1001.2014.3001.5501 技术革新&#xff1a;HTTP/2 协议带来…

深度学习的力量:精准肿瘤检测从此不再遥远

目录 引言 一、医学图像分析的挑战与深度学习的优势 1.1 医学图像分析的挑战 1.2 深度学习的优势 二、肿瘤检测的深度学习模型设计 2.1 卷积神经网络&#xff08;CNN&#xff09;的基本原理 2.2 网络架构设计 2.3 模型训练 三、肿瘤检测中的挑战与解决方案 3.1 数据不…