数据结构-图的创建与深度优先遍历DFS(邻接矩阵-动态类型)

news2024/9/21 18:41:22

图的创建:

我们先构建一个无向图:如图所示

 根据规定,如果两个顶点相连,则两顶点的边改为1,否则为0,我们用数组指针arcs来指向标记是否有边的数组。

1.先创建结构体,因为都为动态所以我们都先定义指针再去动态开辟。

2.初始化函数 创建结构体后初始化图,将顶点个数传入,开辟空间和初始化顶点和边的信息。

3.创建图函数 根据给出的已知各顶点之间边的关系(二维数组)来创建图,传入结构体指针G,顶点,二维数组arts(顶点,边关系),

代码实现:

#include <stdio.h>
#include <stdlib.h>

typedef struct Graph
{
	char* vexs;//顶点
	int** arcs;//边(用二级指针存放存放边的一级指针,一级指针存放边)
	int vexsNum;//顶点的个数
	int arcsNum;//边的个数
}Graph;
//初始化
Graph* initGraph(int vexNum)
{
	Graph* G = (Graph*)malloc(sizeof(Graph));
	G->vexs = (char*)malloc(sizeof(char)*vexNum);
	G->arcs = (int**)malloc(sizeof(int*)*vexNum);
	for (int i = 0; i < vexNum; i++)
	{
		G->arcs[i] = (int*)malloc(sizeof(int) * vexNum);//根据顶点个数开辟n个节点空间
	}
	G->vexsNum = vexNum;//将顶点个数赋值给结构体中的顶点个数
	G->arcsNum = 0;//边个数先初始化为0(初始化的时候不知道图的形状)
	return G;//返回节点
}
//创建
void crativeGraph(Graph* G, char* vexs, int* arcs)
{
	for (int i = 0; i <G->vexsNum; i++)
	{
		G->vexs[i] = vexs[i];//(Graph中的顶点数组存放顶点的“名字”)
	for (int j = 0; j < G->vexsNum; j++)
		{
			G->arcs[i][j] = *(arcs + i * G->vexsNum + j);//根据传进来的二维数组对结构体中的二维数组每个元素赋值(构建树与顶点之间的关系),二维数组加一个数表示第i+1个元素(相当于把二维数组全排成一行)                                                            
			if (G->arcs[i][j] != 0)//两顶点之间有边是则数组元素不为0
				G->arcsNum++;//统计边的个数(二维数组中有边则元素为1)                                                                   
		}
	}
	G->arcsNum /= 2;//(二维数组中对每个顶点都单独统计导致计算了两次边的次数,所以要除2)
}

int main()
{
	Graph* G = initGraph(5);//初始化图

	
	//提前根据图的数创建出符合其边的关系的二位数组
	int arcs[5][5] =
	{
		0,1,1,1,0,
		1,0,1,1,1,
		1,1,0,0,0,
		1,1,0,0,1,
		0,1,0,1,0
	};
	crativeGraph(G, "ABCDE", (int*)arcs);//根据已知二维数组创建图
	return 0;
}

 图的深度优先遍历(DFS):

 口诀:一条路走到黑,

            不到南墙不回头,

           撞墙之后再回头,

           回头之后再撞墙。

思路解析:1.找一个节点访问

                  2.找这个节点可以访问的节点

                  3.重复第一步直到访问完所有节点

图字结合解析:

根据此图我们绿色:代表访问,橙色代表:相连节点都为已经访问过的节点所以返回上一节点

1.我们构建一个数组visited,作为标记此顶点是否已经被访问(数组大小为顶点个数,初始值都为零,访问过赋值为1)

2.定义下表index:代表每个顶点数组的下表

解析路线:我们传入A,访问A后visited标注为1随机访问(后续我们会图文解释如何随机访问)与A相连的一个顶点如B,访问B后,标注再访问与B相连的顶点C再标记,与C相连的顶点都已经被访问过,于是返回B,访问其他与B相连且没有标记的顶点如访问D再标记,与D相连的E访问再标记。E相连的都被标记,返回D,返回时已经访问完所有顶点。

 

代码参考:

//DFS深度优先遍历的访问
void DFS(Graph* G, int* visited, int index)
{
	
		printf("%c->", G->vexs[index]);//先打印出顶点
		visited[index] = 1;//再把访问过的顶点做标记
	
	for (int i = 0; i < G->vexsNum; i++)
	{
		if (G->arcs[index][i] == 1 && !visited[i])//当有相连顶点且没有被访问时进入递归
		{
			DFS(G, visited, i);
		}
	}
}
int main()
{
	Graph* G = initGraph(5);
	//创建深度优先遍历的时候判断该顶点是否被访问的数组
	int* visited = (int*)malloc(sizeof(int) * G->vexsNum);
	for (int i = 0; i < G->vexsNum; i++)
	{
		visited[i] = 0;//先把每个元素都设为0,当被访问过的时候就改变元素的值
	}
	//提前根据图的数创建出符合其边的关系的二位数组
	int arcs[5][5] =
	{
		0,1,1,1,0,
		1,0,1,1,1,
		1,1,0,0,0,
		1,1,0,0,1,
		0,1,0,1,0
	};
	crativeGraph(G, "ABCDE", (int*)arcs);
	DFS(G, visited, 0);
	printf("\n");
	return 0;
}

随机访问规律:可以结合下面的图理解我们把index作为结构体中二维数组arcs的行,如访问A后,打印A,将要访问与A相连的顶点再对A所对应的那行一维数组挨个访问,arcs[index][i],index代表第几个顶点,i所代表顶点所对应一维数组的第几个元素,visited代表当前顶点已经被访问。

A的第一个元素为A,arcs[][]为0不符合,挨个往后访问判断第二个元素为B相连,且A已经被访问则递归访问B此时递归的元素index已经变成i,因为要访问第二个顶点B,B在顶点数组vexs中下标为1且i已经++后i=1。以此类推在对B所对应的一维数组判断…………。

 

博主主要通过b站up: TyrantLucifer的个人空间-TyrantLucifer个人主页-哔哩哔哩视频

学习数据结构做成的笔记。

 

 

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

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

相关文章

RabbitMQ详解(四):SpringBoot整合MQ

SpringBoot整合MQ 需要创建两个springboot项目&#xff0c;一个springboot_rabbitmq_producer生产者&#xff0c;一个springboot_rabbitmq_consumer消费者 fanout模式&#xff08;配置文件方式&#xff09; 定义生产者 创建生产者工程 springboot_rabbitmq_producer pom.x…

DragonflyDB 安装使用

前言 全世界最快的内存数据库 Dragonfly是一种针对现代应用程序负荷需求而构建的内存数据库&#xff0c;完全兼容Redis和Memcached的 API&#xff0c;迁移时无需修改任何代码。相比于这些传统的内存数据库&#xff0c;Dragonfly提供了其25倍的吞吐量&#xff0c;高缓存命中率和…

演化博弈模型简介

演化博弈模型简介 文章目录 演化博弈模型简介[toc]1 演化博弈思想2 演化博弈关注的问题3 复制动态中的博弈 1 演化博弈思想 传统博弈苛刻假设&#xff1a; 完全理性完全信息 演化博弈论&#xff1a;演化博弈论(Evolutionary Game Theory)把博弈理论分析和动态演化过程分析结…

【python】Pandas库用法详解!

pandas 是基于NumPy 的一种工具&#xff0c;该工具是为解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型&#xff0c;提供了高效地操作大型数据集所需的工具。pandas提供了大量能使我们快速便捷地处理数据的函数和方法。你很快就会发现&#xff0c;它是使Py…

Android系统启动流程(三)——属性服务

1 属性服务 属性服务的启动在init进程中&#xff0c;init进程初始化的第二阶段初始化中启动了属性服务。 system/core/init/init.cpp int SecondStageMain(int argc, char** argv) {...PropertyInit();...StartPropertyService(&property_fd);...2 启动属性服务 system/…

Win系统软件闪屏/Edge闪屏/Office闪屏 - 解决方案

Win系统软件闪屏/Edge闪屏/Office闪屏 - 解决方案 前言原因解决方案方案1&#xff08;推荐&#xff09;&#xff1a;重新安装核显驱动方案2&#xff1a;软件使用独显方案3&#xff1a;软件关闭硬件加速 前言 使用Win10及以上系统时&#xff0c;可能会出现频繁闪现黑屏的状态&a…

【jupyter】mac os系统下的jupyter的实用技巧

Jupyter notebook是一个开源的web应用&#xff0c;可以让你创建和分享包含代码、公式、可视化和叙述文本的文档。它可以用于数据清洗和转换、数值模拟、统计建模、数据可视化、机器学习等多种用途。 在mac os系统下&#xff0c;有多种方法可以安装jupyter notebook&#xff0c…

十大生产力神器,包括5大jupyter插件和五个提升python研发生产力的神器

JupyterLab&#xff1a;一款下一代的笔记本界面&#xff0c;支持多种编程语言&#xff0c;包括python。它具有灵活的界面&#xff0c;可以配置和安排数据科学、科学计算、计算新闻和机器学习等领域的工作流程。 Voil&#xff1a;一款可以将笔记本转换为安全、独立的web应用程序…

将字符串数组转换为字符串类型

大家好&#xff0c;我是三叔&#xff0c;很高兴这期又和大家见面了&#xff0c;一个奋斗在互联网的打工人。 当你在Java编程中需要将一个字符数组转换为字符串类型时&#xff0c;你可以使用Java内置的String类提供的方法。在本文中&#xff0c;笔者将介绍两种将字符数组转换为…

RabbitMQ详解(二):消息模式 Simple(简单)模式

消息模式 Simple(简单)模式 前提&#xff0c;开放5672:RabbitMQ的通讯端口&#xff0c;及查看创建用户的权限 构建maven工程 导入依赖 依赖下载地址: https://mvnrepository.com/artifact/com.rabbitmq/amqp-client <dependency><groupId>com.rabbitmq</group…

协议:HTTP基础内容掌握

一、简单理解 HTTP HTTP 协议一般指 HTTP&#xff08;超文本传输协议 Hyper Text Transfer Protocol&#xff09;。 HTTP是一个简单的请求/响应协议&#xff0c;它运行在TCP之上。 HTTP是一个基于TCP/IP通信协议来传递数据&#xff08;HTML 文件, 图片文件, 查询结果等&#x…

活动预告 Flutter 之夜 | Flutter Night Beijing

Flutter 是一个开源、可移植的 UI 框架&#xff0c;它为开发人员提供了超能力&#xff0c;可以从单个代码库为任何平台构建美观、高质量的应用程序。它将统一代码库和快速迭代开发的生产力与本机编译和硬件加速渲染的性能和功能相结合。Flutter 今天支持的平台包括安卓&#xf…

简单随机微分方程数值解

1.随机微分方程求解&#xff1a;dX(t) − αXtdt σdWt 法一&#xff1a;Euler-Maruyama %% %O-U过程 %dX(t)-alpha*Xt*dtsigma*dWt,X|t0X0 %alpha2,sigma1,X01 % 设置初始参数 T 1; % 时间区间长度 N 1000; % 离散化的时间步数 dt T/N; …

[医学分割比赛] ISBI2023 APIS多模态医学分割比赛总结 + top3解决方案

ISBI2023 APIS多模态医学分割比赛总结 top3解决方案 0.比赛背景1.比赛任务及结果2.第三名方案 - 龙盈智达&#xff08;北京&#xff09;科技有限公司(0) Data Preprocessing(1) Data Augmentation(2) Approach&#xff08;Model&#xff09;(3) Approach(Data Sampling)(4) Ap…

【QT】学习课-pushButton的使用(1)!

Qt 是一个1991年由Qt Company开发的跨平台C图形用户界面应用程序开发框架。它既可以开发GUI程序&#xff0c;也可用于开发非GUI程序&#xff0c;比如控制台工具和服务器。Qt是面向对象的框架&#xff0c;使用特殊的代码生成扩展&#xff08;称为元对象编译器(Meta Object Compi…

《WebGIS快速开发教程》写好啦

告诉大家一个好消息&#xff0c;经过我没日没夜&#xff0c;呕心沥血的创作&#xff0c;这本叫做《WebGIS快速开发教程》的书籍终于写好了。这本书适用于还未毕业的学生、以及正在从事传统前后端开发但是想转到WebGIS开发的人。 这本书的特点突出一个“快”和“轻”&#xff0c…

三子棋小游戏---(C语言)

目录 前言&#xff1a; 1.菜单的打印 2.三子棋构思 3.实现三子棋 3.1使用宏的方式定义数组 3.2打印棋盘 3.3玩家下棋 3.4电脑随机下棋 3.5判断结局 ❤博主CSDN:啊苏要学习 ▶专栏分类&#xff1a;C语言◀ C语言的学习&#xff0c;是为我们今后学习其它语言打好基础&am…

Kyligence Zen产品体验——一站式指标平台泰酷辣~

文章目录 一、前言二、为什么需要指标化平台三、什么是Kyligence Zen四、Kyligence Zen新特性五、Kyligence Zen注册篇六、Kyligence Zen体验篇七、Kyligence Zen实战篇7.1 导入数据7.2 创建指标7.3 指标分析 八、Kyligence Zen总结篇九、参考资料 一、前言 随着互联网和物联网…

tomcat集群下的session共享和负载均衡(redis实现)

环境 操作系统&#xff1a;windows tomcat1&#xff1a;Apache Tomcat/7.0.52&#xff08;8085&#xff09; tomcat2&#xff1a;Apache Tomcat/7.0.52&#xff08;8086&#xff09; jre&#xff1a;1.7.0_80 nginx&#xff1a;nginx-1.20.1&#xff08;8070&#xff09; redis…

基于 SpringBoot+WebSocket 无DB实现在线聊天室(附源码)

文章目录 基于 SpringBootWebSocket 无DB实现在线聊天室0 项目说明0.1 样例展示0.2 源码地址 1 WebSocket 简介1.1 HTTP1.2 WebSocket1.2.1 WebSocket 协议1.2.2 WebSocket 交互 2 使用教程2.1 客户端&#xff08;浏览器&#xff09;2.1.1 WebSocket 对象2.1.2 WebSocket 事件2…