笔记-dfs在图和树中的一次遍历的区别

图的遍历-----深度优先遍历(dfs),广度优先遍历(bfs)【java详解】 图的遍历是指,从给定图中任意指定的顶点(称为初始点)出发,按照某种搜索方法沿着图的边访问图中的所有顶点,使每个顶点仅被访问一次,这个过程称为图的遍历。遍历过程中得到的顶点序列称为图遍历序列。深度优先搜索(DFS,Depth First Search)广度优先搜索(BFS,Breadth First Search) 阅读详情

这是函数的定义部分,dfs 函数接受三个参数:

def dfs(x: int, fa: int, d: int) -> int
    if d > k:
        return 0
    cnt = 1
    for y in g[x]:
        if y != fa:
            cnt += dfs(y, x, d + 1)
    return cnt
  • x (int 类型):表示当前正在访问的节点的编号。
  • fa (int 类型):表示节点 x 的父节点的编号。这是为了在遍历过程中避免沿着已经访问过的路径返回,防止形成死循环。
  • d (int 类型):表示从根节点到当前节点 x 的深度(路径长度)。

一、树结构中避免访问父节点的原理

在树结构中,任意两个节点之间只有一条路径,每个节点(除了根节点)都有唯一的父节点。代码中的 fa 参数记录了当前节点 x 的父节点,通过 if y != fa 判断,可以确保不会从当前节点回到父节点,从而避免循环。

例如,在调用 dfs(x, fa, d) 时:

  • x 是当前节点
  • fa 是 x 的父节点
  • 遍历 x 的邻接节点 y 时,如果 y 等于 fa,说明这个邻接节点是父节点,应该跳过

二、图结构中这种方法的局限性

在图结构中,节点之间可能存在多条路径和环路,仅仅记录父节点是不够的。例如:

  • 如果图中存在环,即使跳过父节点,仍然可能通过其他路径回到已经访问过的节点
  • 对于无向图中的边 (u, v),在遍历 u 的邻接节点时会访问 v,而遍历 v 的邻接节点时又会访问 u,导致重复遍历

三、图结构中的正确处理方法

在图中进行 DFS 时,通常需要使用一个全局的 visited 数组或集合来记录已经访问过的节点,避免重复访问。以下是修改后的代码示例:

visited = set()  # 全局集合,记录已访问的节点

def dfs(x: int, d: int) -> int:
    if d > k:
        return 0
    if x in visited:  # 如果节点已被访问,直接返回0
        return 0
    visited.add(x)  # 标记当前节点为已访问
    cnt = 1
    for y in g[x]:
        cnt += dfs(y, d + 1)  # 递归访问邻接节点,不再需要fa参数
    return cnt

四、总结

  1. 树结构:由于其无环特性,使用 fa 参数可以有效避免重复访问父节点
  2. 图结构:必须使用 visited 集合来记录已访问节点,否则会导致:
    • 无限循环(如果图中存在环)
    • 重复计算(即使图中没有环
深度优先和宽度优先的区别、前(先)序遍历和中序遍历以及后序遍历的使用 深度优先 深度优先搜索属于图算法的一种 深度优先搜索是一种在开发爬虫早期使用较多的方法。它的目的是要达到被搜索结构的叶结点(即那些不包含任何超链的HTML文件) 过程:是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次. 深度优先遍历 深度优先遍历图的方法是,从图中某顶点v出发: 从图中一个未访问的顶点V开始 沿着一条路一直走到底 第二步路走完过后,再从这条路尽头的节点回退到上一个节点,再从另一条路开始走到底…不断递归重复2和3过程 一直执行3过程,直到所有的顶点都遍历完成(即所以顶点 阅读详情

相关推荐

图的深度优先遍历

本文要解决的问题: 总结一下图的深度优先遍历算法 简述 图的遍历与前面文章中的二叉树遍历还是存在很大区别的。所谓图的遍历指的是从图中的某一个顶点出发访问图中的其余顶点,并且需要保证每个顶点只被访问一次。由于图比二叉树复杂得多,所以前面二叉树的遍历算法在图中是行不通的。因为对于任意一个顶点来讲,都可能与其余的顶点发生连接。如果不对访问的顶点做一些处理,出发重复访问的几率是很高的。因

Miracle_shen的博客 4507

树与图的dfs和bfs(C++)

树是图(树是图的子集),图不一定是树 树有一个根节点,图没有 树可以递归遍历,图要看情况 树有层次划分,图没有 树是一种“层次”关系, 图是“网络”关系 图可分为有向和无向,也可分为有环和无环,树是有向无环图 树与图的存储与深度优先遍历 #include <iostream> #include <algorithm> #include <cstring> using namespace std; const int N = 1000010,M...

qq_63865828的博客 503

旋转矩阵推导

推导前提: 坐标使用右手坐标系,角度逆时针旋转为正。 绕X轴旋转角度为 俯仰角 即Pitch 绕Y轴旋转角度为 偏航角 即Yaw(Head) 绕Z轴旋转角度为 翻滚角 即Roll 一、平面二维坐标点的旋转 如右图所示,根据三角函数关系,可以列出向量OP与OP’的坐标表示形式: x = |OP|•cosα x′ = |OP|•cos(α+β) y = |OP|•sinα y′ = |OP|•sin(α+β) 将P′(x′,y′)表达式展开: x′ =

suixinger_lmh的随笔 1384

数据结构——图的两种遍历【深度优先遍历-广度优先遍历】的区别用法

目录: 一:深度优先遍历 1.定义 2.图表达流程 举例: 代码实现: 3.对于连通图 4.对于非连通图 5.深度优先搜索 6.对无向图的深度优先遍历图解 7.对有向图的深度优先遍历 二:广度优先遍历 1.定义 2.搜索步骤 3.图表达流程 举例: 代码实现: 4.对无向图的广度优先遍历图解 5.对有向图的广度优先遍历图解 三:异同 1.同 2.异 ...

刘鑫磊 3万+

benders分解算法 逻辑思路整理(加星)

一般我们经常可以看到的是经典的benders,此处我也结合经典的benders梳理下思路。

sinat_41348401的博客 7988

NetApp 7-mode初始化详解(原AGGR重建)及注意事项

没想到有生之年还能再写个7-mode的文章,上次接触可能已将近十年,本次恰巧碰到这个机会,边学习边整理,整整一天时间,碰到了不少坑,作为记录。

RaySun的技术Blog 2752

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

DFS && BFS

weixin_43955293的博客 3万+

实战测评:4大搜索API(You.com/Tavily/Exa/Perplexity)谁更适合你的AI项目?附Python调用代码

本文实战测评了You.com、Tavily、Exa和Perplexity四大搜索API在AI项目中的集成应用,详细对比了它们的技术特性和Python调用方法。针对LLM实时数据需求,You.com的优化设计表现突出,支持32k大上下文窗口和快速响应。文章提供了完整的代码示例和场景化选型建议,帮助开发者高效集成搜索API到AI项目中。

weixin_42569329的博客 482

图的遍历(深度优先和广度优先)

相比于树结构的遍历,图的遍历要复杂得多,因为图中的任何一个节点都可能与其它所有节点相邻接。这就意味着,在访问了某个节点之后,可能会顺着某条路径再次返回到这个节点。为了防止对节点进行重复访问,在图的遍历过程中需要记录下已经访问过的节点。深度优先搜索(DFS)和广度优先搜索(BFS)是两种基本的图遍历方法。DFS更适合深入挖掘问题的解决方案,而BFS则适用于逐层分析问题,寻找最短路径或按层次顺序进行操作。

2302_77758423的博客 2891

使用 MATLAB/Simulink + Simscape Electrical 构建一个他励直流电机的启动与制动过程仿真模型

直流电机在工业控制、电动车辆、自动化设备中广泛应用。其中,他励直流电机(Separately Excited DC Motor)因其励磁绕组与电枢绕组分别供电,具有良好的调速性能和启动特性,常用于需要平稳启动和精确控制的场合。在实际应用中,电机的启动过程和制动过程对电网、机械系统以及电机本身都具有重要影响。因此,仿真分析他励直流电机的启动与制动特性,是电机控制设计的重要环节。本文将详细介绍如何使用构建一个他励直流电机的启动与制动过程仿真模型,并通过仿真分析其动态响应。本文详细介绍了如何使用构建一个。

amy_mhd的博客 233

100天精通Python(基础篇)——第20天:pip命令大全

pip升级命令:python -m pip install --upgrade pip pip install name //这里的name是要安装的第三方库名 pip install name -i http://mirrors.aliyun.com/pypi/simple/ 国内镜像源 阿里云:http://mirrors.aliyun.com/pypi/simple/ (推荐使用) 清华大学:https://pypi.tuna.tsinghua.edu.cn/simple 豆瓣:http:/

努力让自己发光,对的人才能迎着光而来 18万+

分别用邻接矩阵和邻接表实现图的深度优先遍历和广度优先遍历_图的BFS、DFS

BFS、DFS分别为广度优先搜索和深度优先搜索的英文首字母缩写。先考虑树的BFS、DFS。树的BFS即层序遍历。层序遍历先访问根结点,再逐个访问根结点的子结点,再逐个访问上述子结点的子结点,以此类推,直至访问过所有结点。树的DFS有三种(先序遍历、中序遍历、后序遍历),这里只说先序遍历。先序遍历先访问根结点,再逐个先序遍历根结点的所有子树。(由递归的定义可知,容易用递归算法实现(函数的递归用到了调...

weixin_39527768的博客 4584

YOLOv9分割训练自己数据和推理训练好模型,并教你使用Labelme工具标注数据(附YOLOv9分割模型结构图),全网最详细教程

YOLOv9 通过研究数据传输时的信息丢失问题,提出了可编程梯度信息(PGI)和通用高效层聚合网络(GELAN)架构,提高了参数利用率和模型性能。与 SOTA 方法相比,GELAN 仅使用传统卷积算子即可实现更好的参数利用率。PGI 适用于从轻型到大型的各种模型,使从头开始训练的模型能够获得更好的结果。YOLOv9 被评价为新的 SOTA 实时目标检测器。接下来本文手把手教你训练自己分割数据集和推理训练好的分割模型。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1493

C++数据结构之图的遍历——DFS和BFS(带有gif演示)

本文介绍了继图的存储结构之后对图进行遍历,分为DFS和BFS两种算法,赋有动态gif图示和相关代码以及注释

m0_56398315的博客 7293

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

深度优先遍历(DFS)

深度优先遍历(,全称为),是我们树或者图这样的数据结构中常⽤的⼀种。这个算法会尽可能深的搜索树或者图的分⽀,直到⼀条路径上的所有节点都被遍历完毕,然后再回溯到上⼀层,继续找⼀条路遍历。以及。因为树的定义本⾝就是递归定义,因此采⽤递归的⽅法去实现树的三种遍历不仅容易理解⽽且代码很简洁。并且前中后序三种遍历的唯⼀区别就是,在做题的时候,选择⼀个适当的遍历顺序,对于算法的理解是⾮常有帮助的。

ijj_zZ的博客 2985

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

图的深度优先遍历(DFS)和广度优先遍历(BFS)算法分析

遍历深度优先遍历无向图的深度优先遍历图解有向图的深度优先遍历图解广度优先遍历无向图的广度优先遍历图解有向图的广度优先遍历图解 图的遍历,所谓遍历,即是对结点的访问。一个图有那么多个结点,如何遍历这些结点,需要特定策略,一般有两种访问策略: 深度优先遍历 广度优先遍历 深度优先遍历 深度优先遍历(Depth First Search)的主要思想是: 首先以一个未被访问过的顶点作为起始顶点,沿当前顶点的边走到未访问过的顶点; 当没有未访问过的顶点时,则回到上一个顶点,继续试探别的顶点,直至所有的

AngelDg的博客 6154

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

图(深度优先遍历、广度优先遍历)

文章目录一、图的概述1.1 什么是图1.2 图对比线性表和树1.3 图的常见概念二、图的存储方式2.1 邻接矩阵2.2 邻接表三、图的遍历3.1 图的深度优先遍历3.1.1 什么是深度优先遍历3.1.2 深度优先遍历的步骤3.1.3 深度优先遍历代码实现3.2 图的广度优先遍历3.2.1 什么是广度优先遍历3.2.2 广度优先遍历的步骤3.2.3 广度优先遍历代码实现 一、图的概述 1.1 什么是图 图(graph)是一种数据结构,它是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E)。

Ronz 的博客 6469

python实现图的DFS和BFS

一.理论部分 图 关于图的定义,在python语言中,我们可以使用字典来进行定义。 在C++语言中可以使用邻接表或者邻接矩阵来进行储存定义。在这里主要介绍python中图的DFS和BFS。 核心思想:解决图的BFS问题就是利用队列的先进先出的思想来解决问题。因为我们需要利用queue来保证树的第几层或者说是图中我们遍历走了几步的顺序。 BFS和树的层序遍历非常类似,这也是很多博客为啥只把...

weizhifei1234的博客 2万+

深度优先遍历和广度优先遍历

DFS与BFS

weixin_63798323的博客 1万+

6.7.图的深度优先遍历(英文缩写DFS)

假设图使用了邻接矩阵或者邻接表存储,如上图,邻接表中各个链表中顶点号都是从左向右递增的,因此,对于某一个顶点,要找到与该顶点相邻的其他顶点,在该邻接表中找到的顺序与左边的邻接矩阵找到的顺序是一致的,因为邻接矩阵的顶点号也是从左向右递增的。下图的两个例子都是从2号顶点开始深度优先遍历图,左边的例子基于之前第一个邻接表,右边的例子基于之前第二个邻接表,由于邻接表的不同,即使从同一个顶点开始深度优先遍历,得到的遍历序列也可能不同,:深度优先遍历的过程中也是在探索各条边所连接的顶点的过程,

ADCvbV的博客 1041

栈和深度优先搜索(DFS)

与 BFS 类似,深度优先搜索(DFS)是用于在树/图中遍历/搜索的另一种重要算法。也可以在更抽象的场景中使用。 正如树的遍历中所提到的,我们可以用 DFS 进行 前序遍历,中序遍历 和 后序遍历。在这三个遍历顺序中有一个共同的特性:除非我们到达最深的结点,否则我们永远不会回溯。 这也是 DFS 和 BFS 之间最大的区别,BFS永远不会深入探索,除非它已经在当前层级访问了所有结点。 模版 递归...

却把清梅嗅的博客 1万+

图的遍历:深度优先搜索(DFS)和广度优先搜索(BFS)

在计算机科学中,图(Graph)是一种数据结构,由节点(也称为顶点)和连接这些节点的边组成。图可以用来表示各种关系,比如社交网络中的朋友关系、地图中的路径、网络中的设备连接等。无向图:图中的边没有方向,表示节点之间的关系是对称的。有向图:图中的边有方向,表示节点之间的关系是单向的。加权图:图中的边带有权重,表示连接两个节点的代价、距离或其他度量。无环图:图中没有形成环路。连通图:图中的任意两个节点之间都有路径相连。在解决图遍历问题时,DFS 和 BFS 是两种非常有用的搜索策略。

qq_22841387的博客 5032

dfs深度优先搜索_图的深度优先搜索(DFS)

dfs深度优先搜索Depth First Search (DFS) is an algorithm that searches a graph/tree, in a depth-wise manner. 深度优先搜索 ( DFS )是一种以深度方式搜索图/树的算法。 There are many ways through which we can traverse through a graph...

从零开始的教程世界 4354
上一篇: LatexShop不能编译xelatex 报错:Recipe terminated with fatal error: spawn latexmk ENOENT. (问题有待解答)
wait021
博客等级 码龄5年 9粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值