图的遍历(c语言)

2023-11-05

图的遍历

概念:图遍历是一种用于在图中搜索顶点的技术。图的遍历也用来决定在搜索过程中访问顶点的顺序。图的遍历可以在不创建循环的情况下找到要在搜索过程中使用的边。这意味着使用图遍历,我们访问图的所有顶点而不进入循环路径。

种类

目前,只有两种

  1. DFS (Depth First Search) 中文:深度优先遍历
  2. BFS (Breadth First Search) 中文:广度优先遍历

深度优先遍历

方法有很多种,我这里采用访问的时候定一个主方向访问的手法.当然逻辑都是一样的,都是采用像树的一样的访问形式……

算法实现

以免有新手不知道,下面出现的numVertexes是顶点数

//邻接矩阵的深度优先遍历
typedef int Boolean; //此行代码就直接相当于定义好了FALSE和TRUE的值了,这两个的值也是用来判断顶点数据是否又被访问过
Boolean visited[MAX]; //该数组为记录访问标识
void DFS(Graph G,int i)
{
	int j;
	visited[i]=TRUE;//立马改为已被访问状态
	printf("%c\t",G->vexs[i]);//打印顶点
	for(j=0; j<G.numVertexes; ++j)//判断该顶点与其余所有顶点之间是否存在关系
		if(G.arc[i][j])==1 && !visited[j])//满足条件一:两个顶点之间存在相互连接关系 条件二:还未被访问过
			DFS(G,j);//对未访问的邻接点进行递归调用
}

void DFSTraverse(MGraph G)
{
	int i;
	for(i=0; i<G.numVertexes; ++i)
		visited[i]=FALSE;//初始化所有的顶点范文标识为FALSE
	for(i=0; i<G.numVertexes; ++i)
		if(!visited[i])//经过上移代码的过程,开始进行寻找未被访问过的顶点
			DFS(G,i);
}


//邻接表的深度优先遍历
void DFS(GraphAdjList GL,int i)
{
	EdgeNode *p;
	visited[i]=TURE;//同上
	printf("%c\t",GL->adjList[i].data);
	p=GL->adjList[i].firstedge;//p指向头指针
	while(p)
	{
		f(!visited[p->adjvex])
			DFS(GL,p->adjvex);//如果还未访问过,就递归调用,将其输出
			p=p->next;//到了此行代码的话,说明发现了已经被访问过得,那就指向下一个
	}
	void DFSTraverse(GraphAdjList GL)
	{
		int i;
		for(i=0; i<GL->numVertexes; ++i)
			visited[i]=FALSE;//全部初始化为未访问状态
		for(i=0; i<GL->numVertexes; ++i)
			if(!visited[i])
				DFS(DL,i);//找到了访问的直接就进入DFS了
	}
}

其实如果细心的可能已经发现其实很像树的先序遍历

广度优先遍历

当我们发现图的深度优先遍历类似于树的先序遍历的时候,我们这时还会发现图的广度优先遍历也很像树的层次遍历.

思维

第一步:以一边的任意一个顶点作为首顶点.
第二步:开始寻找于之有关的顶点.找到并记录下来
第三步:记录以后,将原本的那个顶点放弃,开始以第二步寻找到的顶点为头,寻找与之有关的顶点.
第四步:重复第二步和第三步的操作,直到没有顶点未访问

算法实现

//邻接矩阵的广度遍历
void BFSTravese(MGraph G)
{
	int i, j;
	Queue Q;//另外还借用了队列的知识
	for(i=0; i<G.numvertexes; ++i)
		visited[i]=FALSE;//将未访问过的顶点初始化
	InitQueue(&Q);//队列初始化
	for(i=0; i<G.numVertexes; ++i)
	{
		if(!visited[i])//未被访问过的条件
		{
			visited[i]=TRUE;//那么现在就是已被访问状态了
			printf("%c",G.vexs[i]);
			EnQueue(&Q,i);//入队列
			while(!QueueEmpty(Q))//队列不为空的话就进入
			{
				DeQueue(&Q,&i);//作用已实现,可以将其弄出队列了
				for(j=0; j<G.numVertexes; ++j)
				{
					if(G.arc[i][j]==1 && !visited[j]){
						visited[j]=TRUE;//访问了就把标识给改了
						printf("%c",G.vexs[j]);
						EnQueue(&Q,j);//找到了就将找打的顶点入队列,后序将会使用
					}
				}
			}
		}
	}
}
//邻接表的广度遍历
void BFSTraverse(GraphAdjList GL)
{
	int i;
	EdgeNode *p;
	Queue Q;
	for(i=0; i<GL->numVertexes; ++i)
		visited[i]=FALSE;
	InitQueue(&Q);//解析未做的原因是上面都做过了!!!
	for(i=0; i<G.numVertexes; ++i)
	{
		if(!visited[i])
		{
			visited[i]=TRUE;
			printf("%c",G->adjList[i].data);
			EnQueue(&Q,i);//入队列,后有大用
			while(!QueueEmpty(Q))
			{
				DeQueue(&Q,&i);//开始使用它了,可以出了,用完就不需要了(没错,就是如此无情O~O)!
				p=GL->adjList[i].firstedge;
				while(p)
				{
					if(!visited[p->adjvex])
					{
						visited[p->adjvex]=TRUE;//将访问标识更改
						printf("%c",G-。adjList[p->adjvex].data);
						EnQueue(&Q,p->adjvex);//入队列,后有用
					}
					p=p->next;//一样,到了此步,说明也没发现未被访问的
				}
			}
		}
	}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

图的遍历(c语言) 的相关文章

随机推荐

  • 自定义九宫格控件NineGridLayout ,实现微信朋友圈图片九宫格显示

    前言 很多时候我们都在刷微博或者微信朋友圈的时候都会看到很多图片 而这些图片的显示跟我们平时很多控件的显示方式都不一样 而且 当我们仔细去观察后就会发现 他加载的图片都是根据图片数量动态加载的 根据不同的图片数量来用不同的布局显示 如下图
  • 硬件防火墙和软件防火墙的区别有哪些?

    什么是防火墙 防火墙 指由软件和硬件设备组合而成 在内部网和外部网之间 局域网与外网之间的保护屏障 就像架起了一面墙 它能使网络之间建立起一个安全网关 从而保护内部网免受非法用户的侵入 熟悉互联网的朋友一定对防火墙不陌生 不管是电脑自带的防
  • OBJ格式简单用法

    参考 https www cnblogs com hont p 5239725 html https zhuanlan zhihu com p 342244212 http zwqxin com archives opengl obj mo
  • ceph-deploy命令应用

    记录 336 场景 在CentOS 7 9操作系统上 使用ceph deploy创建ceph集群 部署集群的mon mgr mds osd rgw等组件 版本 操作系统 CentOS 7 9 ceph版本 ceph 13 2 10 名词 c
  • Flask简单调用Redis、MySQL和生成token及token验证

    项目地址 https github com MasonYyp myflask 1 安装python基础环境 安装flask pip install flask 安装redis pip install redis 安装操作MySQL的包 pi
  • 如家酒店房价爬虫

    爬取地址 http m homeinns com hotels J10013 如家精选 北京中关村东路店 首先 从chrome浏览器打开F12审查元素 价格是用背景图片形式展现的 我们先获取背景图片 图片url 图片地址为 http m h
  • Java 基础入门篇(五):面向对象编程

    文章目录 一 面向对象的思想 二 类的定义与对象的创建 三 对象内存分配情况 3 1 两个对象的内存图 3 2 两个变量指向同一个对象内存图 四 构造器 4 1 构造器的格式与分类 4 2 构造器的调用 五 this 关键字 六 封装 七
  • springboot整合shiro(新手教程)

    咱们也就不多哔哔 直接开始 我先放我自己写的项目结构 第一步 想啥了 肯定是先创建一个springboot的项目 第二步 配置pom文件
  • vue3.0新增和删除的内容

    新增组件
  • 关于解决构建maven项目中报错:Failed to execute goal org.apache.maven.pluginsmaven-archetype-plugin

    1 首先进入仓库下面repositoryorgapachemavenplugins这个目录 2 删除目录下的maven archetype plugin文件夹 3 重新加载
  • Streamlit 讲解专栏(十):数据可视化-图表绘制详解(上)

    文章目录 1 前言 2 st line chart 绘制线状图 3 st area chart 绘制面积图 4 st bar chart 绘制柱状图 5 st pyplot 绘制自定义图表 6 结语 1 前言 在数据可视化的世界中 绘制清晰
  • 2022国赛15:Windows——文件共享

    试题内容 四 文件共享 任务描述 为了使局域网中的特定用户 能够访问共享文件夹内的 特定资源 请采用文件共享 实现共享资源的安全访问 1 在 windows1 创建用户主目录共享文件夹 本地目录为 D share home 共享名为 hom
  • React请求数据渲染页面

    1 使用react fetch数据发送请求 1 get方法 componentDidMount fetch url then res gt res json then json gt this setState list json 2 po
  • npm、pnpm、yarn的常用命令

    npm pnpm yarn的常用命令 文章目录 npm pnpm yarn的常用命令 一 常用命令 1 npm命令 2 pnpm命令 3 yarn命令 二 对比 一 常用命令 1 npm命令 npm init 初始化一个新的npm包 npm
  • 第12章 图形用户界面基础

    1 Swing和AWT的不同 AWT适合开发简单的图形用户界面 但不适合开发复杂的GUI项目 也容易发生于特定平台相关的故障 重量级组件 SWing更稳定 更通用 更灵活 不依赖于自己GUI 轻量级组件 SWing GUI组件类都以字母J为
  • EasyCHM编译的文件在点击节点时出现错误:确保Web地址//ieframe.dll/dnserrordiagoff.htm#正确

    EasyCHM编译后的文件打开时出现错误提示 解决方案 一 mht文件的文件名及路径中不能包含中文 二 修改节点的属性 检查路径是否正确
  • zookeeper

    1 zookeeper是什么 参考文献 Zookeeper可以干什么 zookeeper为分布式应用程序提供一致性协调服务 包括配置维护 域名服务 分布式锁 集群管理等 配置维护 同一个应用程序在不同服务器上的配置信息相同 将应用程序的配置
  • Android集成bilibili播放器以及弹幕

    考虑到开发直播和视频播放的必要性 网上了解到b站开源播放器 https github com bilibili ijkplayer 好用 集成下试试 运行后发现b站原生的只能播放没有其他选项 考虑到方便性 采用这个方案 https gith
  • Qt modbus使用详解

    不讲理论 只讲应用 看完这篇就能用起来 爽不爽 具体内容目录如下 如需请订阅专栏后观看 目录 一 Modbus协议通信过程 1 1 主机对从机写数据操作 0x06 1 2 主机对从机读数据操作 0x03 1 3 Modbus的CRC校验 二
  • 图的遍历(c语言)

    文章目录 图的遍历 种类 深度优先遍历 算法实现 广度优先遍历 算法实现 图的遍历 概念 图遍历是一种用于在图中搜索顶点的技术 图的遍历也用来决定在搜索过程中访问顶点的顺序 图的遍历可以在不创建循环的情况下找到要在搜索过程中使用的边 这意味