图的遍历介绍

概念

特点

无论是进行哪种遍历,均需要通过设置辅助数组标记顶点是否被访问来避免重复访问!!!!

类型

深度优先遍历

可以实现一次遍历访问一个连通图中的所有顶点,只要连通就能继续向下访问。

因此,深度递归次数就是图中连通分量数。

遍历过程

类似树的先根遍历,先访问结点,再访问与其邻接的第一个结点。

示例

遍历邻接矩阵表示图的实现

效率分析

非连通图的遍历

广度优先搜索

遍历过程

类似于树的层序遍历,先访问结点,再访问与结点邻接的所有结点。

 

非连通图的遍历

遍历邻接表表示图的实现

效率分析

DFS其底层是借助一个递归工作栈实现的。

而BFS是借助一个辅助队列实现的。

时间复杂度只与存储结构有关!!!!!

代码整合

#include <iostream> 
#define maxn 100
#define infi 333333
using namespace std;
int visit[maxn]={0}; 
//邻接矩阵:顶点数+边数+顶点表(一维)+边表(二维) 
typedef struct node{
	int vnum,arcnum;
	char vexs[maxn];
	int acr[maxn][maxn];
}adjgraph;
//邻接表:顶点数+边数+顶点表==>顶点类型:顶点信息+第一条边==> 边类型:顶点编号+权值+下一条边 
typedef struct acrnode{
	int num;
	int weigh;
	acrnode *nextacr;
}acrnode;
typedef struct vexnode{
	char vex;
	acrnode *firstacr;
}vexnode; 
typedef struct node{
	int vnum,acrnum;
	vexnode vexs[maxn];
}listgraph;

//深度遍历 
//递归实现:传入图与起点,不断调用自身 
//用邻接矩阵实现 
void dfs1(adjgraph g,int v){ 
	cout<<v<<endl;
	visit[v]=1;
	for(int i=0;i<g.vnum;i++){
		if(visit[i]==0&&acr[v][i]!=infi)
		dfs(g,i);
	}
}
//用邻接表实现 
void dfs2(listgraph l,int v){
	acrnode edge;
	vexnode vex; 
	cout<<v<<endl;
	visit[v]=1;
	for(edge=l.vexs[v].firstacr;edge;edge=edge.nextacr){//遍历与v相连的所有边-有边 
	     vex=l.vexs;//记录结点
		 if(!visit[vex]) //且未被访问 
		 dfs(l,vex);//访问结点 
	}
}

//非递归实现:通过栈实现
//1.初始栈和标志数组
//2.起点元素入栈,
//3.栈非空:出栈访问,遍历下一条邻接边,未被访问时入栈,取下一个邻接结点 
stack<int> s
void dfs(adjgraph g,int v){//邻接矩阵实现 
	int t;
	initstack(s);
	push(s,v);
	while(!empty(s)){
		t=pop(s,v);
		if(!visit[t]){
			cout<<t<<endl;
			visit[t]=1;
		}
		for(int i=0;i<g.vnum;i++){
			if(g.arcnum[v][i]!=infi&&(!visit[i]))
			{
				push(s,i);
			}
		}
	}
}


//广度遍历
1.初始队列与标记数组
2.起点元素入队,
3.队非空:出队,遍历边,未被访问时访问入队 
void bfs(listgraph l,int v) {
	//用队列实现
	acrnode w;
	cout<<v<<endl;
	visit[v]=1;
	init(q); enqueue(q,v);
	while(!isempty(q)) {
		dequeue(q,v);
		for(w=l.vexs[v].firstacr;w;w=w.nextacr)//遍历邻接的所有边 
		{
			if(!visit[w]){
				cout<<w<<endl;
				visit[w]=1;
				enqueue(q,w);
			}
		}
	}
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

48【Aseprite 作图】荷塘月色——拆解

1 荷叶&#xff0c;不要完全对称&#xff0c;下面是深色的&#xff0c;上面是浅色的&#xff0c;加一点高光 2 鱼的轮廓 上色彩&#xff0c;主要用三种颜色&#xff0c;修改透明度&#xff0c;叠加颜色

“粘土风格”轻松拿捏,基于函数计算部署 ComfyUI实现AI生图

阿里云函数计算 FC 一键部署火爆全球工作流 AI 生图平台—— ComfyUI &#xff0c;实现更高质量的图像生成&#xff0c;三步轻松完成“黏土”创意AI画作&#xff0c;晒图赢眼部按摩器等好礼&#xff01; 活动地址&#xff1a; https://developer.aliyun.com/topic/june/fcspma…

Vue3【十七】props的作用和组件之间的传值限定类型和默认值

Vue3【十七】props的作用和组件之间的传值限定类型和默认值 Vue3【十七】props的作用和组件之间的传值限定类型和默认值 父组件传值给子组件 多个值传递 传值限定类型和 默认值 实例截图 目录结构 代码 person.vue <template><div class"person"><p…

Python版本管理器-Miniconda

随着Python的版本更新&#xff0c;我们在开发Python软件的时候&#xff0c;对Python的版本选择越来越重要&#xff0c;但同时又要兼容已经开发好了的Python软件&#xff0c;因此选择一款合适的Python版本管理器对提高开发效率也越来越重要&#xff0c;今天就推荐一款Python的版…

InfiniBand网络内计算架构指南

InfiniBand网络内计算知多少&#xff1f; InfiniBand在高性能计算和人工智能领域占据核心地位&#xff0c;其高速、低延迟的网络通信能力支持大规模数据传输与复杂计算。在网络内计算领域&#xff0c;InfiniBand的应用日益广泛&#xff0c;通过内部计算降低延迟&#xff0c;提升…

【JVM】之常见面试题

文章目录 1.JVM中的内存区域划分2.JVM的类加载机制2.1 加载2.2 验证2.3 准备2.4 解析2.5 初始化2.6 类加载的时机 3 类加载器4.双亲委派模型5.JVM中的垃圾回收策略5.1 找谁是垃圾5.1.1 引用计数法5.1.2 可达性分析法 5.2 释放垃圾5.2.1 标记清除算法5.2.2 复制算法5.2.3 标记整…

ASUS华硕ROG幻14Air笔记本GA403UI(UI UV UU UJ)工厂模式原厂Windows11系统安装包,带MyASUS in WinRE重置还原

适用型号&#xff1a;GA403UI、GA403UV、GA403UU、GA403UJ 链接&#xff1a;https://pan.baidu.com/s/1tz8PZbYKakfvUoXafQPLIg?pwd1mtc 提取码&#xff1a;1mtc 华硕原装WIN11系统工厂包带有ASUS RECOVERY恢复功能、自带面部识别,声卡,显卡,网卡,蓝牙等所有驱动、出厂主题…

【Python】已完美解决:(Python键盘中断报错问题) KeyboardInterrupt

文章目录 一、问题背景二、可能出错的原因三、错误代码示例四、正确代码示例&#xff08;结合实战场景&#xff09;五、注意事项 已解决&#xff1a;Python中处理KeyboardInterrupt&#xff08;键盘中断&#xff09;报错问题 一、问题背景 在Python编程中&#xff0c;当我们运…

uni-date-picker 禁用日期功能

在uni-datetime-picker组件中 calendar.vue <template><view class"uni-calendar" mouseleave"leaveCale"><view v-if"!insert && show" class"uni-calendar__mask" :class"{uni-calendar--mask-show:an…

Python-Socket网络编程简单示例

# TCP 服务端程序 server.py # 导入socket 库 from socket import *# 主机地址为空字符串&#xff0c;表示绑定本机所有网络接口ip地址 # 等待客户端来连接 IP # 端口号 PORT 50000 # 定义一次从socket缓冲区最多读入512个字节数据 BUFLEN 512# 实例化一个socket对象 # 参…

【kubernetes】k8s集群安全机制 保姆级攻略

目录 一、认证&#xff08;Authentication&#xff09; Kubernetes 作为一个分布式集群的管理工具&#xff0c;保证集群的安全性是其一个重要的任务。API Server 是集群内部各个组件通信的中介&#xff0c; 也是外部控制的入口。所以 Kubernetes 的安全机制基本就是围绕保护 A…

牛客 NC129 阶乘末尾0的数量【简单 基础数学 Java/Go/PHP/C++】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/aa03dff18376454c9d2e359163bf44b8 https://www.lintcode.com/problem/2 思路 Java代码 import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff…

LabVIEW结构体内部缺陷振动检测

结构体内部缺陷会改变其振动特性&#xff0c;通过振动分析可以检测并定位这些缺陷。本文详细分析内部缺陷对振动的影响&#xff0c;从频谱分析、时域分析和模态分析等多角度探讨基于LabVIEW的检测方法&#xff0c;提供实施步骤和注意事项&#xff0c;帮助工程师有效利用LabVIEW…

1224 - 过河卒

题目描述 AA 点有一个过河卒&#xff0c;需要走到目标 BB 点。 卒行走规则&#xff1a;可以向下、或者向右。同时在棋盘上的任一点有一个对方的马&#xff08;如下图的 CC 点&#xff09;&#xff0c;该马所在的点和所有跳跃一步可达的点称为对方马的控制点。 例如&#xff…

哪个牌子洗地机最好?四款甄选佳品安利,质量放心

作为一个熟悉智能清洁家电的行业者&#xff0c;洗地机可谓是实用性最高的地面清洁工具&#xff0c;这个实用性一方面是清洁力强&#xff0c;它集合了扫地和拖地能力&#xff0c;另一方面是操作方便&#xff0c;清洁速度快。可是面对市面上种类繁多的智能清洁家电&#xff0c;往…

C语言之数组

目录 一、数组的概念 二、一维数组的使用 数组的创建 数组的初始化 数组的使用 三、一维数组在内存中的存储 四、sizeof计算数组元素个数 五、二维数组的使用 数组的创建 数组的初始化 数组的使用 六、二维数组在内存中的存储 七、C99中的变长数组 八、总结 一、…

“JS加密在线”:简单直接的在线JS加密网站

网站名&#xff1a;“JS加密在线”&#xff0c; 功能&#xff1a;JavaScript源代码加密。 UI&#xff1a; http://jsjiami.online/ 非常简洁的JS加密网站&#xff0c;几乎只有两个功能&#xff1a;上传JS文件、下载加密后的JS文件。 JS加密&#xff0c;就应该这样简单直接。…

AI机器人公众号小程序h5源码开源交付支持二开黑色风格版本

AI机器人系统对接OPENAI&#xff1a;开启智能新纪元 更新全新UI、新增全家桶模块、新增热榜板块、支持语音朗读、支持快速回答、支持AI绘图、支持文字一键生成图、支持导出pdf、支持导出word、支持导出文字、支持快速响应、支持中英翻译、支持markdown &#x1f680;一、引言…

直流遥控器 继电器8-10V应用 降压恒压SL3036电源芯片

在现代电子设备中&#xff0c;电源的稳定性和可靠性对于设备的正常运行至关重要。特别是在直流遥控器这类设备中&#xff0c;由于其需要长时间稳定运行且对电压稳定性要求较高&#xff0c;因此选择一款合适的电源芯片显得尤为重要。本文将重点介绍SL3036电源芯片在直流遥控器继…

爬虫-电影影评爬取

先上代码 import requests import timeheaders {"referer": "http://movie.mtime.com/","user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36" } fo…