数据结构-图的遍历

news2025/1/10 14:18:50

广度优先遍历(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]; //访问标记数组

bool visited[MAX_VERTEX_NUM]; //访问标记数组
//广度优先遍历
void BFS(Grapg 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>=0;w=NextNeighbor(G,v,w))
        	//检测v所有邻接点
            if(!visited[w]){	//w为v的尚未访问的邻接顶点
                visit(w);		//访问顶点w
                visited[w]=TRUE;	//对w做已访问标记
                EnQueue(Q,w);		//顶点w入队列
            }//if
    }//while
}

同一个图的邻接矩阵表示方式唯一,因此广度优先遍历序列唯一
同一个图邻接表表示方式不唯一,因此广度优先遍历序列不唯一

BFS算法(Final版)

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
}
//广度优先遍历
void BFS(Grapg 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>=0;w=NextNeighbor(G,v,w))
        	//检测v所有邻接点
            if(!visited[w]){	//w为v的尚未访问的邻接顶点
                visit(w);		//访问顶点w
                visited[w]=TRUE;	//对w做已访问标记
                EnQueue(Q,w);		//顶点w入队列
            }//if
    }//while
}

用于解决非连通图
对于无向图,调用BFS函数的次数=连通分量数

广度优先生成树

image.png广度优先生成树由广度优先遍历过程确定。由于邻接表的表示方式不唯一,因此基于邻接表的广度优先生成树也不唯一

广度优先生成森林

image.png

深度优先遍历(DFS)

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);
        }//if
}

image.png
DFS算法(Final版)

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);
}
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);
        }//if
}

解决非连通图

同一个图的邻接矩阵表示方式唯一,因此深度优先遍历序列唯一
同一个图邻接表表示方式不唯一,因此深度优先遍历序列不唯一

图的遍历与图的连通性

对无向图进行BFS/DFS遍历
调用BFS/DFS函数的次数=连通分量数
对于连通图,只需调用1次BFS/DFS

对有向图进行BFS/DFS遍历
调用BFS/DFS函数的次数要具体问题具体分析
若起始顶点到其他各顶点都有路径,则只需调用1次
BFS/DFS函数

对于强连通图,从任一结点出发都只需调用1次BFS/DFS

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

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

相关文章

Postman基本页面和请求/响应页签介绍

近期在复习Postman的基础知识&#xff0c;在小破站上跟着百里老师系统复习了一遍&#xff0c;也做了一些笔记&#xff0c;希望可以给大家一点点启发。 一、Postman的界面介绍 Home主页、Workspace工作空间、Collections集合、Environments环境变量、Mock Server虚拟服务器、Mo…

Git图形化界面GUI的使用SSH协议及idea集成Git

前言 图形化界面&#xff08;GUI&#xff0c;Graphical User Interface&#xff09;是一种用户与计算机程序或操作系统交互的方式&#xff0c;通过图形元素&#xff0c;如图标、按钮、窗口等&#xff0c;而不是通过命令行来完成操作。GUI的设计旨在让用户通过直观的图形界面进行…

云表|低代码开发是否真的靠谱?一试便知

最近&#xff0c;“低代码”这个概念在技术圈里火了起来&#xff0c;引发了广泛的讨论。一些人对其赞不绝口&#xff0c;认为它具有诸多优点&#xff0c;如减少开发周期&#xff0c;提高系统开发效率&#xff0c;降低开发成本&#xff0c;学习成本低等。他们甚至预测&#xff0…

lv11 嵌入式开发 ARM体系结构理论基础(寄存器)3

目录 1 寄存器 2 ARM寄存器 2.1 专用寄存器 1 寄存器 概念 寄存器是处理器内部的存储器&#xff0c;没有地址 作用 一般用于暂时存放参与运算的数据和运算结果 注&#xff1a;全局变量不应该存入寄存器&#xff0c;数量有限会占用寄存器资源&#xff0c;寄存器读…

矩阵的除法

B/A 如果矩阵A可逆&#xff0c;那么 证明&#xff1a; A/AB 如果矩阵A和B都可逆&#xff0c;那么 证明&#xff1a;

人工智能基础——Python:Numpy与矩阵

人工智能的学习之路非常漫长&#xff0c;不少人因为学习路线不对或者学习内容不够专业而举步难行。不过别担心&#xff0c;我为大家整理了一份600多G的学习资源&#xff0c;基本上涵盖了人工智能学习的所有内容。点击下方链接,0元进群领取学习资源,让你的学习之路更加顺畅!记得…

OTA包添加自定义内容

起因 新开一条线&#xff0c;需要上传的OTA包里加点内容&#xff0c;好让后台校验它是否是当前这条线(短期最小改动)。 开整 之前看过ota包结构&#xff0c;整包和差分包里都有一个payload_properties.txt文件&#xff0c;所以最简单的就是给这个txt文件里追加点自定义内容&…

NodeJs - 集合对象序列化问题

NodeJs - 集合对象序列化问题 一. 集合对象的序列化问题1.1 Map 和 Object 的区别1.2 Map 的相关转换Map 和 Array 互转Map 和 Object 互转 1.3 Set 的相关转换Set 和 Array 互转 一. 集合对象的序列化问题 案例如下&#xff1a;我们创建一个Map和一个Set集合&#xff0c;并用…

宋浩高等数学笔记(三)微分中值定理

首先是考研大纲包含的内容&#xff1a; 1.理解并会用罗尔(Rolle)定理、拉格朗日(Lagrange)中值定理和泰勒(Taylor)定理&#xff0c;了解并会用柯西(Cauchy)中值定理. 2.掌握用洛必达法则求未定式极限的方法. 3.理解函数的极值概念&#xff0c;掌握用导数判断函数的单调性和求函…

黑窗口连接远程服务

ssh root192.168.x.x 回车输入密码 查看docker docker ps 停止正在运行的服务 docker stop xxxxx 删除服务 docker rm xxxxx 查看镜像 docker images 删除镜像 docker rmi xxxxx 删除镜像 启动并运行整个服务 docker compose up -d jar包名称 idea 使用tcp方式连接docker 配置d…

mongo实际业务场景实战

业务场景 有四个业务信息,分别是适用部门、适用岗位、适用职级、适用专业。 1.适用部门有三个层级类似D001表示一级部门、D001002表示二级部门、D001002001表示三级部门,ALL表示所有部门。 2.适用岗位有岗位A、岗位B、ALL等,ALL表示适用所有岗位。 3.适用职级有M-1,M-2、AL…

【免费送书】写博客模板

【点我-这里送书】 本人详解 作者&#xff1a;王文峰&#xff0c;参加过 CSDN 2020年度博客之星&#xff0c;《Java王大师王天师》 公众号&#xff1a;JAVA开发王大师&#xff0c;专注于天道酬勤的 Java 开发问题中国国学、传统文化和代码爱好者的程序人生&#xff0c;期待你的…

Q3季刊|Coremail管理员社区Q3季刊发布

2023年Q3季刊新近完成&#xff0c;接下来将带领大家回顾2023年Q3Coremail管理员社区的精彩活动和内容。 01、Coremail管理员社区 Coremail 管理员社区属于云服务中心板块之一&#xff0c;由Coremail服务团队、邮件安全团队及多条产品线共同维护&#xff0c;定位为知识库社区&…

【UE5】 虚拟制片教程

目录 效果 步骤 一、下载素材 二、将视频转成PNG序列 三、开始虚拟制片 效果 步骤 一、下载素材 首先下载绿幕视频素材 链接&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;jyfk 二、将视频转成PNG序列 打开“Adobe Premiere Pro”&#xff0c;导入素材 …

家乡特色饮食体验系统的设计与实现-计算机毕设 附源码 27533

家乡特色饮食体验系统的设计与实现 摘 要 信息化社会内需要与之针对性的信息获取途径&#xff0c;但是途径的扩展基本上为人们所努力的方向&#xff0c;由于站在的角度存在偏差&#xff0c;人们经常能够获得不同类型信息&#xff0c;这也是技术最为难以攻克的课题。针对家乡特色…

Springboot养老院信息管理系统的开发-计算机毕设 附源码27500

Springboot养老院信息管理系统的开发 摘 要 随着互联网趋势的到来&#xff0c;各行各业都在考虑利用互联网将自己推广出去&#xff0c;最好方式就是建立自己的互联网系统&#xff0c;并对其进行维护和管理。在现实运用中&#xff0c;应用软件的工作规则和开发步骤&#xff0c;…

数据结构与算法C语言版学习笔记(6)-树、二叉树、赫夫曼树

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、树的定义1.结点的度、树的度2.结点的逻辑关系3.树的深度4.有序树和无序树5.森林 二、树的存储结构&#xff08;1&#xff09;双亲表示法&#xff08;2&…

神经网络可视化:卷积核可视化

文章目录 前言一般过程&#xff1a; 一、代码示例二、卷积核和输入图片相乘可视化总结 前言 卷积核可视化是一种用于理解卷积神经网络 (CNN) 中卷积层的工作原理和特征提取能力的方法。通过可视化卷积核&#xff0c;我们可以观察卷积层学习到的特征模式&#xff0c;帮助我们理…

煤矿企业如何选择合适的设备健康管理系统

在煤矿开采的过程中&#xff0c;机电设备发挥着重要的作用。但大量的机电设备的使用也给煤矿企业设备管理提出了一定的要求。随着工业领域数字化的深入应用&#xff0c;煤矿机电设备的自动化、智能化管理已经成为煤矿企业发展的重要手段。保障机电设备的正常运行&#xff0c;减…

跨境电商源码搭建:开启你的全球贸易新纪元

随着全球电子商务的快速发展&#xff0c;跨境电商已经成为越来越多企业的必然选择。通过跨境电商平台&#xff0c;企业可以拓展海外市场&#xff0c;扩大销售范围&#xff0c;提升品牌影响力。而要实现这一目标&#xff0c;源码搭建是不可或缺的一环。本文将为你揭示跨境电商源…