图的遍历介绍

概念

特点

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

类型

深度优先遍历

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

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

遍历过程

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

示例

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

效率分析

非连通图的遍历

广度优先搜索

遍历过程

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

 

非连通图的遍历

遍历邻接表表示图的实现

效率分析

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

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

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

相关文章

day07--454.四数相加II+383. 赎金信+ 15. 三数之和+ 18. 四数之和

一、454.四数相加II 题目链接&#xff1a;https://leetcode.cn/problems/4sum-ii/ 文章讲解&#xff1a;https://programmercarl.com/0454.%E5%9B%9B%E6%95%B0%E7%9B%B8%E5%8A%A0II.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE 视频讲解&#xff1a;https://www.bili…

【论文阅读】-- Omnisketch:高效的多维任意谓词高速流分析

Omnisketch&#xff1a;高效的多维任意谓词高速流分析 摘要1 引言2 预备知识及相关工作3 OMNISKETCH&#xff1a;使用任意谓词估计频率3.1 Sketch S0&#xff1a;Count-Min with rid-sets 用于估计带有谓词的查询3.2 Sketch S1 &#xff08;OmniSketch&#xff09;&#xff1a;…

使用ShinyCell展示你的单细胞数据

在我参与发表我的第一篇植物单细胞文章中&#xff0c;我用Shiny开发了一个简单的单细胞可视化网站&#xff0c;目前已经运行了5年了&#xff0c;有上万的访问&#xff0c;唯一的不足就是太简陋。我一直想着能不能找个一个更好的工具进行展示&#xff0c;最近发现了一个工具&…

嵌入式linux中内存管理基本原理

各位开发者,大家好,今天主要给大家分享一下,如何使用linux系统中的内存管理。 前面我们学习了很多Linux内存方面的知识,比如:虚拟地址空间,进程空间,内存映射,页表机制等,我们学了这么多知识,似乎对Linux内存似懂非懂,为什么会出现这样的问题?原因在于我们缺…

redis+lua实现分布式限流

redislua实现分布式限流 文章目录 redislua实现分布式限流为什么使用redislua实现分布式限流使用ZSET也可以实现限流&#xff0c;为什么选择lua的方式实现依赖lua脚本yaml代码实现 Jmeter压测 为什么使用redislua实现分布式限流 原子性&#xff1a;通过Lua脚本执行限流逻辑&am…

无人机RTMP推流EasyDSS直播平台推流成功,不显示直播按钮是什么原因?

互联网视频云平台/视频点播直播/视频推拉流EasyDSS支持HTTP、HLS、RTMP等播出协议&#xff0c;并且兼容多终端&#xff0c;如Windows、Android、iOS、Mac等。为了便于用户集成与二次开发&#xff0c;我们也提供了API接口供用户调用和集成。在无人机场景上&#xff0c;可以通过E…

[linux]基于Ubuntu24.04原内核6.8.0升级到6.9.0

物理机操作系统&#xff1a; 虚拟机操作系统&#xff1a; Ubuntu 24.04 下载地址&#xff1a; https://mirror.nju.edu.cn/ubuntu-releases/24.04/ubuntu-24.04-desktop-amd64.iso VM版本信息&#xff1a; 内核源代码来源&#xff1a; https://ftp.sjtu.edu.cn/sites/ftp.kern…

四六级考前突击之主题词预测

考前主题词预测 时政类 Digital Economy 数字经济 (Digitalization数字化) Hong Kong Zhuhai-Macau Bridge 港珠澳大桥 Greater Bay Area 大湾区 Poverty Alleviation 扶贫 Anti-corruption campaign 反腐斗争 Rural Revitalization(注入活力) Strategy(战略,策略) 乡村振兴…

课设--学生成绩管理系统

欢迎来到 Papicatch的博客 文章目录 &#x1f349;技术核心 &#x1f349;引言 &#x1f348;标识 &#x1f348;背景 &#x1f348;项目概述 &#x1f348; 文档概述 &#x1f349;可行性分析的前提 &#x1f348;项目的要求 &#x1f348;项目的目标 &#x1f348;…

vue自定义一个回到顶部组件

1.首先创建一个backTop.vue页面&#xff1a; 页面有两个按钮&#xff0c;一个回到顶部按钮&#xff0c;一个刷新按钮(showRefresh:false将刷新按钮隐藏)&#xff0c;实现效果如下&#xff1a; 代码解析&#xff1a; domName:需要监听滚动的dom类名&#xff0c;不传默认监听bod…

搜维尔科技:特斯拉称工厂内有两台人形机器人开始自主工作

搜维尔科技消息&#xff0c;据外电报道&#xff0c;特斯拉声称&#xff0c;其目前拥有两台 Optimus 人形机器人在工厂内自主工作&#xff0c;这尚属首次。 如果目前这场薪酬方案混乱有什么好处的话&#xff0c;那就是特斯拉几乎看起来又有了一个公关部门。 当然&#xff0c;其…

记录open62541简单有效的编译生成.c和.h文件【OPCUA开源库】

一、下载和安装CMake 虽然说可以通过下面命令安装CMake,但是安装CMake时,通常会安装来自你的操作系统的软件仓库中的版本,这个版本可能不是最新的 sudo apt-get install cmake 如果安装后发现CMake版本低于CMake 3.13是没有办法进行编译的 接下来通过编译源码来升级高版本…

基数排序O(n)时间复杂度的实现

基数排序O(n)时间复杂度的实现 前言 之前写过一篇文章六种常见排序算法分析与实现&#xff0c;讲了六种常见的排序算法&#xff0c;但是没有了解到桶排序&#xff0c;基数排序这两种排序算法&#xff0c;今天刷LeetCode发现了这两种算法&#xff0c;本文先来聊聊基数排序的思…

Ubuntu字体相关

Ubuntu字体相关 解决字体相关问题 Windows字体 sudo apt install font-manager sudo apt update && sudo apt install ttf-mscorefonts-installer # 安装字体至系统范围 sudo cp *.ttf /usr/local/share/fonts/ sudo cp *.ttc /usr/local/share/fonts/ # 重建字体缓…

06 SpringBoot 配置文件详解-application.yaml

Spring Boot 提供了大量的自动配置&#xff0c;极大地简化了spring 应用的开发过程&#xff0c;当用户创建了一个 Spring Boot 项目后&#xff0c;即使不进行任何配置&#xff0c;该项目也能顺利的运行起来。当然&#xff0c;用户也可以根据自身的需要使用配置文件修改 Spring …

以太坊网络中为什么要设置Gas上限

以太坊网络中的Gas上限&#xff08;Gas Limit&#xff09;是一个重要的机制&#xff0c;它主要出于以下几个目的&#xff1a; 防止无限循环和拒绝服务攻击&#xff08;DoS&#xff09;&#xff1a; Gas上限防止了智能合约中的无限循环&#xff0c;这可以保护网络免受恶意合约的…

vue3 vant4 仿京东分类功能实现

Ⅰ- 壹 - 功能展示和使用需求 需求描述 基于vant 实现,仿京东分类功能实现样式交互等基本实现,细节可能需要优化 地址 https://gitee.com/wswhq/vue3-vant-temp/tree/master/src/view/ClassIfication 功能展示 Ⅱ - 贰 - 封装思路 不表述了自己看代码吧 Ⅲ - 叁 - 使用 …

TikTok账号被限流的原因及解决方法

TikTok账号被限流无疑是众多内容创作者面临的一大难题。流量骤减&#xff0c;账号活跃度下降&#xff0c;究竟是什么原因导致限流呢&#xff1f;本文将深入分析TikTok限流的几大成因&#xff0c;并提供一些解决方案&#xff0c;特别是推荐海外云手机这一工具&#xff0c;有效避…

c++工程实践——实际工程中的文件读取和日期处理的小问题

一、问题 在实际开发中遇到了两个小问题&#xff0c;一个是文件流的读写中的长度和结尾判断;另外一个是C11库std::chrono::duration的数据类型的问题。这两个问题导致了两个结果&#xff1a; 1、流结尾判断不准确&#xff0c;多读一帧导致长度判断恒为正确&#xff0c;文件不加…

你认为这个项目的难点和亮点是什么?

你认为这个项目的难点和亮点是什么&#xff1f; 好的&#xff0c;面试官&#xff0c;这个项目对于我来说还是有一定的挑战性的&#xff0c;在此过程中&#xff0c;我也成长和学习到了不少。亮点和难点方面我主要从三个方面来阐述&#xff0c;一个是业务方面&#xff0c;一个是整…