图的二种遍历-广度优先遍历和深度优先遍历

news2024/11/25 20:15:07

图的广度优先遍历

1.树的广度优先遍历

这样一个图中,是如何实现广度优先遍历的呢,首先,从1遍历完成之后,在去遍历2,3,4,最后遍历5 ,6 , 7  , 8。这也就是为什么叫做广度优先遍历,是一层一层的往广的遍历

6fe8cc5f62b847b8aee52d730b34f502.png

不存在“回路”,搜索相邻的结点时,不可能搜到已经访问过的结点


树的广度优先遍历(层序遍历)

①若树非空,则根节点入队


②若队列非空,队头元素出队并访问,同时将该元素的孩子依次入队

③重复②直到队列为空

2.图的广度优先遍历

图的广度优先和树的广度优先还是非常相似的,首先我们假设我们从 2 号结点开始,然后广度优先遍历 1 ,  6 (这里面1和6的顺序无所谓,但是还是为了保持一定的顺序,一般从小的开始)然后1的话再遍历就是5 , 6再找相邻的就是 3 和 7 ,于是访问的就是 5 ,3  ,7 。在找到下一层就是 4 ,8 。

026401909d4a4f578e2e3ae3c2f52b59.png

广度优先遍历(Breadth-First-Search, BFS)要点:

1.找到与一个顶点相邻的所有顶点·
2、标记哪些顶点被访问过
3.需要一个辅助队列


FirstNeighbor(G,x):求图G中顶点x的第一个邻接点,若有则返回顶点号。若x没有邻接点或图中不存在x,则返回-1。
NextNeighbor(G,x,y)︰假设图G中顶点y是顶点x的一个邻接点,返回除y之外顶点x的下一个邻接点的顶点号,若y是x的最后一个邻接点,则返回-1。
 

代码

bool visited [MAX_VERTEX_NUM];/访问标记数组

//广度优先遍历
void BFS( Graph G,int v){//从顶点v出发,广度优先遍历图G
	visit(v);	//访问初始顶点v
	
	visited [v]=TRUE;	//对v做已访问标记
	
	Enqueue(Q,v);     //顶点v入队列Q
	
	while( !isEmpty(Q) ){
	DeQueue(Q, v);    //顶点v出队列
	for(w=FirstNeighbor(G,v ) ;w>= ;  w=NextNeighbor(G,v,w))
	//检测v所有邻接点
	if( !visited [w] )//w为v的尚未访问的邻接顶点
	{
	   visit(w);//访问顶点w
	   visited [w]=TRUE;//对w做已访问标记
	   EnQueue(Q,w);//顶点w入队列

	}
}

按照上面的例子,首先

我们先遍历到 2 ,2 放到队列,如果队列不空,把 1 和 6 放到队尾,然后 1号出队,和 1号邻的为

5和 2 ,由于 2被visit了所以访问未被访问的结点5,5号结点入队,都访问完了,看六号结点,六号结点出队。6号结点相邻的且未被访问的是3 , 7 。visit 3 和 7 并且都放在队尾,然后看3 ,和3相邻的且未被访问的是4 号,访问4号结点,让4 号结点入队,最后,3号出队,看7号结点,与7号结点相邻的且未被访问的是8号结点。最后所有结点都被访问。

 09897e2c62f5419889a70faaa6e3672f.png 

f8ffab6ee76e46c3859cc0cdefa9b7dc.png

 

3.算法存在的问题和解决方案

前面介绍的都是连通图,如果是非连通图,那么上面算法就实现不了。我们可以直接从0号结点开始,遍历所有结点查看是否有未被访问的结点,找到第一个值为false的结点。从这个结点出发调用BFS。

 

代码

bool visited [MAX_VERTEX_NUM] ;   //访问标记数组
void BFSTraverse(Graph G){       //对图G进行广度优先遍历
   for( i=0; i<G.vexnum;++i)
       visited[i]=FALSE;          //访问标记数组初始化
   InitQueue(Q);                //初始化辅助队列Q
   for( i=0; i<G.vexnum;++i)    //从0号顶点开始遍历
      if( !visited[i])            //对每个连通分量调用一次BFS
         BFS(G,i);               // vi未访问过,从vi开始BFS
}

bool visited [MAX_VERTEX_NUM];/访问标记数组

//广度优先遍历
void BFS( Graph G,int v){//从顶点v出发,广度优先遍历图G
	visit(v);	//访问初始顶点v
	
	visited [v]=TRUE;	//对v做已访问标记
	
	Enqueue(Q,v);     //顶点v入队列Q
	
	while( !isEmpty(Q) ){
	DeQueue(Q, v);    //顶点v出队列
	for(w=FirstNeighbor(G,v ) ;w>= ;  w=NextNeighbor(G,v,w))
	//检测v所有邻接点
	if( !visited [w] )//w为v的尚未访问的邻接顶点
	{
	   visit(w);//访问顶点w
	   visited [w]=TRUE;//对w做已访问标记
	   EnQueue(Q,w);//顶点w入队列

	}
}

 

4.知识回顾与总结

 


 

图的深度优先遍历

1.树的深度优先遍历

树的深度优先遍历有点类似于先根遍历

首先遍历 1 2 5 6 3  4 7 8 ,它的遍历更趋向于先深层的遍历树。

 

2.图的深度优先遍历

首先我们可以先看一下2,和2相邻的是1号结点和6号结点。和2相邻的第一个结点是1,所以先访问1,1号结点未被访问。和1号结点相邻的为2 号和5号,但是2号被访问过了,所以看5号结点。和5号结点相邻的结点点都被访问过。这个顶点的DFS调用完,返回到1号接点调用层,但是1号节点调用都被调用完了,那么就可以返回2号结点调用层,2号结点身边的结点未被访问。即是6号结点。和6号结点相近的且未被访问的是 3和 7号结点,先访问3号结点,下一个应该被访问的是4号结点,和4号相邻的且未被访问的是7号结点,最后8号结点未被访问,访问一下8号结点。

 

代码

bool visited [MAX_VERTEX_NUM] ;//访问标记数组
void DFS(Graph G,int v){    //从顶点v出发,深度优先遍历图G
   visit(v );   //访问顶点v
   visited [v]=TRUE;   //设已访问标记
   for( w=FirstNeighbor(G,v) ;w>=0 ; w=NextNeighor(G,v,w) )
   if( !visited [w] ){    //w为u的尚未访问的邻接顶点
      DFS(G,w) ;
}

 

3.算法存在的问题和解决方案

与广度优先算法一样,如果存在非连通图,那么同样的,我们可以直接从0号结点开始,遍历所有结点查看是否有未被访问的结点,找到第一个值为false的结点。从这个结点出发调用BFS。

最终代码

bool visited [MAX_VERTEX_NUM];//访问标记数组
void DFSTraverse(Graph G){   //对图G进行深度优先遍历
   for( v=0; v<G.vexnum;++v)
     visited[v]=FALSE;       //初始化已访问标记数据
   for( v=0 ; v<G.vexnum; ++v)   //本代码中是从v=0开始遍历
     if( !visited[v])
       DFS(G,v);
}


bool visited [MAX_VERTEX_NUM] ;//访问标记数组
void DFS(Graph G,int v){    //从顶点v出发,深度优先遍历图G
   visit(v );   //访问顶点v
   visited [v]=TRUE;   //设已访问标记
   for( w=FirstNeighbor(G,v) ;w>=0 ; w=NextNeighor(G,v,w) )
   if( !visited [w] ){    //w为u的尚未访问的邻接顶点
      DFS(G,w) ;
}

4.知识回顾与总结

 

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

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

相关文章

36个数据分析方法与模型

目录一、战略与组织二、质量与生产三、营销服务四、财务管理五、人力资源六、互联网运营好的数据分析师不仅熟练地掌握了分析工具&#xff0c;还掌握了大量的数据分析方法和模型。这样得出的结论不仅具备条理性和逻辑性&#xff0c;而且还更具备结构化和体系化&#xff0c;并保…

Python连接MYSQL、SQL Server、Oracle数据入库一网打尽

描述&#xff1a; Python众所周知用来数据提取&#xff0c;通俗说用来抓数据&#xff0c;将拿到的数据进行数据清洗、加工,分析等等。而其中最重要的部分就是数据爬取、数据入库这两部分了&#xff0c;至于数据分析那就特别考察你的SQL能力&#xff0c;如果是自己设计页面&…

马齿苋多糖偶联顺铂复合物/黄连素偶联顺铂化合物/载顺铂mPEg-PGA纳米微球制备方法

小编今天整理了马齿苋多糖偶联顺铂复合物/黄连素偶联顺铂化合物/载顺铂mPEg-PGA纳米微球制备方法&#xff0c;一起来看&#xff01; 黄连素偶联顺铂化合物制备方法: 以A549/DDP细胞为研究对象,分别加入12 μg/mL的顺铂,浓度为20 μmol/L,40 μmol/L,80 μmol/L的黄连素12 μg/…

艾美捷EndoGrade卵清蛋白重组示例说明

卵清蛋白是一种优质蛋白质&#xff0c;占蛋清蛋白总量的 54%-69%&#xff0c;卵清蛋白是典型的球蛋白&#xff0c;分子量为 44.5k Da&#xff0c;属含磷糖蛋白&#xff0c;含有四个自由巯基、385 个氨基酸残基。这些氨基酸残基相互缠绕折叠形成具有高度二级结构的球型结构&…

spring cache (默认方式)

目录前置pom配置示列代码效果图部分源码关键类流程代码描述 (此类无用, 只是备注源码的逻辑)前置 什么是springcache: 通过注解就能实现缓存功能, 简化在业务中去操作缓存 Spring Cache只是提供了一层抽象, 底层可以切换不同的cache实现. 通过CacheManager接口来统一不同的缓存…

大数据培训课程MapTask工作机制

MapTask工作机制 MapTask工作机制如图4-12所示。 图4-12 MapTask工作机制 &#xff08;1&#xff09;Read阶段&#xff1a;MapTask通过用户编写的RecordReader&#xff0c;从输入InputSplit中解析出一个个key/value。 &#xff08;2&#xff09;Map阶段&#xff1a;该节点主要…

java面试强基(9)

字符串拼接用“” 还是 StringBuilder? ​ Java 语言本身并不支持运算符重载&#xff0c;“”和“”是专门为 String 类重载过的运算符&#xff0c;也是 Java 中仅有的两个重载过的运算符。 ​ 字符串对象通过“”的字符串拼接方式&#xff0c;实际上是通过 StringBuilder 调…

【MFC】一个最简单的MFC程序(9)

了解完MFC程序的流程后&#xff0c;会有 “果然不需要了解这些东西&#xff0c;直接用就可以了” 的感觉。这应该是MFC的初衷吧——按照框架来&#xff0c;集中精力做应用。但是没有了解呢&#xff1f; 最简单的MFC程序 步骤&#xff1a; 1、创建WIN32应用程序&#xff0c;空…

GoWeb 的 MVC 入门实战案例,基于 Iris 框架实现(附案例全代码)

1、什么是 MVC M 即 Model 模型是指模型表示业务规则。在MVC的三个部件中&#xff0c;模型拥有最多的处理任务。被模型返回的数据是中立的&#xff0c;模型与数据格式无关&#xff0c;这样一个模型能为多个视图提供数据&#xff0c;由于应用于模型的代码只需写一次就可以被多个…

1531_AURIX_TriCore内核架构_任务以及函数

全部学习汇总&#xff1a; GreyZhang/g_tricore_architecture: some learning note about tricore architecture. (github.com) 继续前面的内核架构学习&#xff0c;这次看一下任务以及函数的描述。 1. 在嵌入式系统中&#xff0c;内核以及函数的设计其实是有一定的模型或者说是…

day33 文件上传中间件解析漏洞编辑器安全

前言 先判断中间件&#xff0c;是否有解析漏洞&#xff0c;字典扫描拿到上传点&#xff0c;或者会员中心&#xff0c;有可能存在文件上传的地方&#xff0c;而后测试绕过/验证&#xff0c;根据实际情况判断是白名单、黑名单还是内容其他的绕过&#xff0c;绕过/验证和中间件的…

数字信号处理FFT快速傅立叶变换MATLAB实现——实例

今天做作业的时候发现要对一个信号进行FFT变换&#xff0c;在网上找了半天也没找到个能看懂的&#xff08;因为我太菜了&#xff09;&#xff0c;后来自己研究了一下&#xff0c;感觉一知半解的 起因是这道作业题 例题-满足奈奎斯特 我画了两个图&#xff0c;一个是原信号经过…

毕业论文管理系统的设计与实现

摘要 随着互联网技术的迅猛发展&#xff0c;网络给人们带来了很多便利&#xff0c;比如人们借助于网络进行相互交流、相互通信、共享信息、文件的上传下载等。在线毕业论文管理系统就是以上运用之一&#xff0c;它已经广泛的应用于目前的各大高校,但现有的这些系统都有一定的局…

如何在VScode和Jetbrain上使用备受争议的GitHub Copilot

如何在VScode和Jetbrain上使用备受争议的GitHub Copilot VSCDOE https://docs.github.com/en/copilot/quickstart 配置好之后&#xff0c;就是这种效果&#xff0c;真实太NB了&#xff01;&#xff01;&#xff01; 一个tab就把所有的代码都填充上去了&#xff01; Jetbrain…

MES系统以全流程优化为核心,实现全闭环的生产

MES系统是一个在车间中广泛使用的软件&#xff0c;它具有承上启下的功能.该系统采用企业ERP系统&#xff0c;获取计划、资源等数据&#xff0c;并与PLM、SRM、WMS等进行整合&#xff0c;获取BOM、流程等数据。该系统可对下级的控制系统进行操作&#xff0c;并将作业命令和恢复计…

Prometheus Operator 极简配置方式在k8s一条龙安装Prometheus 监控

在k8s上 Prometheus&#xff08;普罗米修斯&#xff09; 监控&#xff0c;需要部署各种组件&#xff0c;比如Prometheus、Alertmanager、Grafana。同时各个组件的配置文件也是需要到处各个配置&#xff0c;Prometheus配置监控服务时&#xff0c;你还要知道各个监控服务的地址&a…

JDBC编程

JDBC编程 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5QlM7GTR-1669108965995)(https://img1.baidu.com/it/u865461056,274570923&fm253&fmtauto&app138&fPNG?w794&h500)] 什么是JDBC Java数据库连接 Java Database Connect…

第2-4-2章 规则引擎Drools入门案例-业务规则管理系统-组件化-中台

文章目录3. Drools入门案例3.1 业务场景说明3.2 开发实现3.3 小结3.3.1 规则引擎构成3.3.2 相关概念说明3.3.3 规则引擎执行过程3.3.4 KIE介绍3. Drools入门案例 全套代码及资料全部完整提供&#xff0c;点此处下载 本小节通过一个Drools入门案例来让大家初步了解Drools的使用…

Java 集合学习笔记:HashMap

Java 集合学习笔记&#xff1a;HashMapUML简介阅读源码属性字段1. 静态属性2.成员属性静态内部类class Node<K,V>静态工具方法hash(Object key)comparableClassFor(Object x)compareComparables(Class<?> kc, Object k, Object x)tableSizeFor(int cap)构造方法Ha…

电梯物联网网关软硬件一体化解决方案

电梯物联网监测平台&#xff0c;基于边缘计算智能监测设备全天候、全自动监测电梯的运行。通过采集电梯实时运行传感数据&#xff0c;建立运行状态关键数据标准&#xff0c;基于AI机器学习算法&#xff0c;采用大数据分析计算&#xff0c;对电梯故障、困人等事件实时报警&#…