深度优先(DFS)和广度优先(BFS)的实现方法

深度优先算法和广度优先算法 今天做了daoti 阅读详情

可以从图的搜索方式引入这两种搜索方法。假设有下面一个图:


深度优先的搜索方式就是从一个顶点v出发,选择邻接于v的尚未达到的顶点u,如果这样的u不存在,则搜索终止。如果u存在,那么从u又开始一个新的DFS,也就是递归。例如在上图的搜索中第一回递归到达的路径是1->2->5->8

广度优先的搜索方式就是从一个顶点v出发,先搜索所有邻接于顶点v的顶点集合,这算一回搜索,第二回搜索以邻接于顶点v的集合点出发,开始搜索所有邻接于这些顶点的邻接点。例如第一回搜索到达的顶点是1->2->3->4

两种搜索方式的C++描述如下:

1 深度优先搜索

  1)图是邻接矩阵描述时

void dfs(int v,int reach [],int label)
{
   reach[v]=label; //已经找到的点做个标记
   for(int u=1;u<=n;u++)//n为顶点数
   {//访问与v相邻的顶点
      if(a[v][u]!=noEdge&&reach[u]==0)
      {//noEdge表示不存在的边,reach[u]==0表示还没有达到此顶点
       dfs(u,reach,label);
      }
   }
}

2)图是链表数组描述时

void dfs(int v,int reach [],int label)
{
   reach[v]=label; //已经找到的点做个标记
   for(chainNode<int>*u=aList[v].firstNode;u!=nullptr;u=u->next)//aList为链表数组 
   {//访问与v相邻的顶点
      if(reach[u->element]==0)
      {//u是还没有达到的顶点
       dfs(u,reach,label);
      }
   }
}

2  广度优先搜索

1)图是邻接矩阵描述时

void bfs(int v,int reach[],int label)
{
    arrayQueue<int> q(10);//数组描述的队列,长度指定为10
//这里如果邻接于某个点的点很多,这里的长度可以调整
    reach[v]=label;
    q.push(v);
    while(!q.empty())
    {
       //从队列中删除一个已经标记的点
       int w=q.front();
       q.pop();
      for(int u=1;u<=n;u++)
      {//标记所有邻接于顶点w的还没有达到的顶点
         if(a[w][u]!=noEdge&&reach[u]==0)
         {//u是一个还没有达到的点
            q.push(u); //等着下次标记邻接它的顶点
            reach[u]=label; //标记此顶点
         }
      }
    }
  
}

2)图是链表数组描述时

void bfs(int v,int reach[],int label)
{
    arrayQueue<int> q(10);
    reach[v]=label;
    q.push(v);
    while(!q.empty())
    {
       //从队列中删除一个已经标记的点
       int w=q.front();
       q.pop();
      for(chainNode<int>* u=aList[w].firstNode;u!=nullptr;u=u->next)
      {//标记所有邻接于顶点w的还没有达到的顶点
         if(reach[u->element]==0)
         {//u是一个还没有达到的点
            q.push(u->element); //等着下次标记邻接它的顶点
            reach[u->element]=label; //标记此顶点
         }
      }
    }
  
}

数据结构与算法(7-2)图的遍历(深度优先遍历DFS、广度优先遍历BFS)(分别用邻接矩阵和邻接表实现) 一、深度优先遍历(DFS) 阅读详情

相关推荐

python实现BFS(广度优先搜索)& DFS(深度优先搜索)

BFS(广度优先搜索): 图1 BFS 图2 BFS 图3 Queue of BFS 图一是BFS(广度优先搜索)在树的情况下的执行过程,从A出发,搜索A的第二层,发现有B,C,D(必须从左到右搜索),再搜索B的第二层,发现B的第二层没有元素,再搜索C的第二层,发现有E,F,放置于D后面,再搜索D的第二层,发现有G,放置于F后面,再往下搜索E,F,G,发现只有G有第二层H和I,所以最后得到: A B C D E F G H I 图二是BF..

Huangkaihong的博客 8428

图的相关操作【C++数据结构】

图的相关操作~~~~~~一共六个类,分别实现加权有向图的建立,遍历,宽度遍历,深度遍历                    加权无向图的最小耗费生成书存储结构用的是二维数组~~~~第一个类,加权有向~~~~main方法在其cpp文件中~~~ template class AdjacencyWDigraph {public: AdjacencyWDigraph(int

稻草誓言的专栏 1329

python实现图(基于图的不同存储方式)的深度优先(DFS)和广度(BFS)优先遍历

对于图在计算机内不同的存储方式,图的深度和广度优先遍历算法的写法也不同,但是两种算法的基本思想不变的,本文介绍不同方式存储的图的两种遍历方法的实现。

time_money的博客 2840

广度优先搜索,深度优先搜索

在通信相关的问题中,图论算法是一个实用性很强的理论知识点。        图论算法的两种最基本算法,深度优先算法,广度优先算法。        广度优先搜索算法相对比较简单。一个实例是求单源无权最短路径问题。广度优先算法,顾名思义,是在搜索的广度上组织程序的,利用的数据结构是队列。        将节点分为两类,已发现、未发现。最初已发现节点为源节点一个,其余均为未发现节点。首先将源节点加入

bh0616的专栏 633

【深度优先搜索】一个实例+两张动图彻底理解 DFS | DFS 与 BFS 的区别 | 用 DFS 自动控制我们的小游戏

前言: 在第一篇文章中,我们讨论了 如何用 pygame 写一个小游戏,并用键盘交互控制 。接下来,我们将分别用 DFS 、BFS 、DRL 实现自动控制。这篇文章讨论了什么是深度优先搜索,如何匹配其到我们的小游戏上。

记录学习痕迹的公众号:Piper蛋窝 4232

图的遍历-邻接矩阵实现DFS和BFS,c语言实现

首先是我个渣对两种遍历方法的看法 BFS:寻找最优解,比如最短路径.时间复杂度更低,一圈一圈搜索,深度不大的时候比较适用,但是 DFS:不撞南墙不回头,所以相对于BFS 找到的不一定是最优解,但是其对于空间的消耗较少,因为不需要存储临时节点   对于DFS,其实现方法类似于先序遍历,不断递归的调用DFS函数,依次向下搜寻。   首先是图结构体的实现 struct GNode { ...

Mrs_fanshuishui的博客 5302

数据结构与算法之美 30图的表示 31 深度和广度优先搜索

30 | 图的表示: 如何存储微博、微信等社交网络中的好友关系? 1. 图定义: 树中的元素我们称为节点,图中的元素我们就叫做顶点(vertex)。图中的一个顶点可以与任意其他顶点建立连接关系。我们把这种建立的关系叫做边(edge)。 顶点的入度,表示有多少条边指向这个顶点;顶点的出度,表示有多少条边是以这个顶点为起点指向其他顶点。 2. 带权图 3.邻接矩阵(Adjacency Matrix)存储方法 邻接矩阵的缺点 顶点很多,但每个顶点的边并不多,邻接矩阵的存储方法就更加浪费空间 邻接矩阵的

春江花月夜 471

学习STM32的无人机控制

下面是一个基于STM32的无人机控制的简单示例代码,包括四旋翼的PID控制、遥控器信号解析和电机控制。本示例以STM32F103系列为例,使用Keil C编译器进行开发。

qq_67153941的博客 706

深度优先和广度优先算法

1、深度优先算法 遍历规则:不断地沿着顶点的深度方向遍历。顶点的深度方向是指它的邻接点方向。 最后得出的结果为:ABDECFHG。 Python代码实现的伪代码如下: 2、广度优先算法: 遍历规则: 1)先访问完当前顶点的所有邻接点。(应该看得出广度的意思) 2)先访问顶点的邻接点先于后访问顶点的邻接点被访问。 最后得出的结果为:ABCDEFGH。 Python代码实现的伪代码如下: 3.总结 深度优先遍历:对每一个可能的分支路径深入到不能再深入为止,而且每...

bgogo的博客 8941

从3dB定向耦合器到双圆极化天线:在HFSS里玩转相位差90°的馈电艺术

本文详细介绍了在HFSS中设计3dB定向耦合器与双圆极化天线的关键技术,重点解析了90°相位差生成原理及馈电网络设计。通过HFSS仿真工具,实现从定向耦合器到完整天线系统的集成,优化阵列天线性能,适用于卫星通信和雷达系统。

weixin_33717117的博客 556

GPMC开发笔记(TI开发者推荐笔记)

因为gpmc(General-Purpose Memory Controller)是TI特有的驱动,gpmc的资料比较少,本人开发gpmc驱动算是摸了很多石头过河的。所以想通过这遍文章可以给也做GPMC驱动开发的后来者有一点参考价值。文章如有瑕疵也请各位批评改正。 1.GPMC介绍 gpmc主要用于与nandflash,norflash,fpga进行通信。在这里主要介绍gpmc16位数据和地址线不复用nor模式下的通信。 注意:在这种模式下gpmc_a[0]引脚是没法使用的 1.1GPMC信号线

weixin_44316996的博客 7508

【基础知识】一文看懂深度优先算法和广度优先算法

先上个图现在我们要访问图中的每个节点,即图的遍历。图的遍历是指,从给定图中任意指定的顶点(称为初始点)出发,按照某种搜索方法沿着图的边访问图中的所有顶点,使每个顶点仅被访问一次,这个过程称为图的遍历。我们根据访问节点的顺序与方式(根据搜索方法),可以分为广度优先(BFS)和深度优先(DFS),这是图论中两种非常重要的算法,生产上广泛用于拓扑排序,寻路(走迷宫),搜索引擎,爬虫等。我们分别来介绍。

fumeidonga的博客 1万+

deepin启动异常处理

修复的命令在执行时会输出大量的修复信息,正常情况下修复完之后输入exit命令回车后,即可正常启动系统。

whxxiang的博客 4370

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

深度优先遍历和广度优先遍历 深度优先遍历和广度优先遍历是遍历图当中所有顶点的两种方式。 深度优先遍历(DFS) 顾名思义,深度优先遍历就是找准一条路不停深入的搜索方法,当发现这条路走不通的时候就会回退到上一个探索的节点,如果上一个节点存在没有探索的分支,便继续探索若没有则继续回退。深度优先遍历就有点像二叉树中的前序、中序和后序遍历。 深度优先遍历的关键就在于如何找到已经探索过节点的上一个节点,也就是如何回溯。 深度优先算法示意图 线上标注的便是探索的顺序,可以看出深度优先遍历是走到头再回退寻找其他出路的遍

renxing的博客 3万+

PCB工程师必看:别再搞错1078玻纤布的Dk了,手把手教你算等效介电常数

本文为PCB工程师提供了1078玻纤布等效介电常数(Dk)的详细计算指南,帮助解决高速设计中的信号完整性问题。通过解析玻纤布结构、混合介质理论和实战计算方法,指导工程师准确设置EDA工具参数,避免常见的Dk计算误区,提升设计精度和仿真准确性。

weixin_42546392的博客 399

白皮精读:70页 2025 基于数据空间的金融数据可信流通研究报告【附全文阅读】

金融数据可信流通面临法规、技术与商业模式的挑战。报告分析国内外发展现状,提出基于数据空间的可信流通框架,包含典型场景、技术方案与流通模式。实践案例显示,隐私计算、区块链等技术可提升风控效率与合规性。建议完善数据分类分级、统一技术标准并推动行业试点,以释放数据要素价值,促进数字经济发展。

cdfunlove的博客 850

算法总结-深度优先遍历和广度优先遍历

所以广度优先遍历也叫层序遍历,先遍历第一层(节点 1),再遍历第二层(节点 2,3,4),第三层(5,6,7,8),第四层(9,10)。(1)、我们从根节点1开始深度优先遍历,它相邻的节点有2、3、4,依先遍历节点2,再遍历2的右边节点5,再遍历9,至此便无可遍历的节点。对于每个节点来说,先遍历当前节点,然后把右节点压栈,再压左节点(这样弹栈的时候会先拿到左节点遍历,符合深度优先遍历要求)。广度优先遍历,指的是从图的一个未遍历的节点出发,先遍历这个节点的相邻节点,再依次遍历每个相邻节点的相邻节点。

hhhlizhao的博客 2万+

运行时安全引擎RSE

该博客重点介绍了运行时安全引擎(Runtime Security Engine,简称 RSE)与应用处理器(Application Processor,简称 AP)之间的关系。 根据 ARM 的参考设计,RSE 是位于同一芯片(die)上的一个独立核心,与 AP 和系统控制处理器(System Control Processor,简称 SCP)并列存在。RSE 为整个系统提供基本的安全保障和运行时服务,例如:可信启动(trusted boot)、度量启动(measured boot)、平台认证(platf

AI-安全-功耗 1365

深度优先遍历(DFS)和广度优先遍历(BFS)

转载:https://blog.youkuaiyun.com/rr123rrr/article/details/77971771 图的搜索有两种方式,一种是深度优先搜索(Depth-First-Search),另一种是广度优先搜索(Breadth-First-Search),接下来,我们来写一下这些搜索方式的Java实现,同样的,这里的代码均继承了自定义的EnhanceModual类,我之前的文章(查看En...

yimixgg的博客 19万+

探秘RK3588:OverlayFS挂载与固件升级全攻略

本文围绕RK3588芯片的OverlayFS文件系统挂载与固件升级技术展开详细阐述。首先介绍了RK3588芯片的卓越性能及其在嵌入式领域的广泛应用,重点分析了OverlayFS文件系统的分层架构原理及其在RK3588设备上的挂载方法,包括详细的挂载步骤、常见问题解决方案。随后详细阐述了RK3588设备在Windows和Linux环境下的固件升级方案,涵盖升级准备、具体操作流程及故障处理等内容。最后通过智能安防监控设备的实际案例,展示了OverlayFS挂载与固件升级技术的应用效果。文章为嵌入式开发者提供了全

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 287

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

二叉树的深度优先遍历(DFS)与广度优先遍历(BFS)

二叉树的深度优先遍历(DFS)与广度优先遍历(BFS) 深度优先遍历:从根节点出发,沿着左子树方向进行纵向遍历,直到找到叶子节点为止。然后回溯到前一个节点,进行右子树节点的遍历,直到遍历完所有可达节点为止。 广度优先遍历:从根节点出发,在横向遍历二叉树层段节点的基础上纵向遍历二叉树的层次。 DFS:ABDECFG BFS:ABCDEFG DFS实现: 数据结构:栈 父节点

mingwanganyu的博客 5万+

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

深度优先搜索(DFS)和广度优先搜索(BFS)(学习总结)

深度优先搜索: ①定义:是一种枚举所有完整路径以遍历所有情况的搜索方法。 ②如何实现DFS: 使用栈较麻烦。 类比斐波那契数列,可以使用递归这种方式来实现DFS。使用递归系统会调用叫系统栈的东西存放递归中的每一层状态,本质还是栈实现。 ③例子 (1)全排列 求1 2 3或1 2 3 4全排列可以使用几个for循环解决,但当求1到n(n小于等于10)用for不能解决则利用递归。 #include <iostream> using namespace std; int n; int book[20]

xiaotutuyahttp_的博客 5457

STM32F407中文手册

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

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

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

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

qq_22841387的博客 5032

Java图的表示与遍历(深度优先算法DFS+广度优先算法BFS)

1.图的表示 图的表示方式有两种:二维数组表示(邻接矩阵);链表表示(邻接表) 邻接矩阵是表示图形中顶点之间相邻关系的矩阵,对于n个顶点的图而言,矩阵是的row和col表示的是1…n个点。 邻接矩阵需要为每个顶点都分配n个边的空间,其实有很多边都是不存在,会造成空间的一定损失. 邻接表的实现只关心存在的边,不关心不存在的边。因此没有空间浪费,邻接表由数组+链表组成 为了表示方便,之后的图用二维...

m0_38036210的博客 1667

邻接矩阵的深度优先遍历和广度优先遍历(无向图)

邻接矩阵的深度优先遍历和广度优先遍历(无向图) #include<stdio.h> #include<stdlib.h> #include<string.h> #include<queue> #include<iostream> using namespace std; #define MAXGRAPH 100 int visited[MAXGRAPH]; //访问过的顶点数组 typedef struct Graph_G { char ver

qq_40181728的博客 4817

DFS与BFS

无论是DFS还是BFS他们的时间复杂度空间复杂度都是O(n),对于这两种方法,我们都是在遍历树的基础上实现的。DFS运用的递归原型也可以理解为树型遍历,BFS使用队列的方式实现效率更高且更直观。

2401_86449430的博客 1477
上一篇: LeetCode39-组合总和
下一篇: 排序算法总结(C++描述)
Jeff_Winger
博客等级 码龄9年 50粉丝 110原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值