图的创建和BFS,DFS遍历

图的创建        

        图是一种用于表示对象及其关系的抽象数据结构,由节点(也称为顶点)和连接节点的边组成。图可以分为有向图(Directed Graph)和无向图(Undirected Graph),以及加权图(Weighted Graph)和非加权图(Unweighted Graph)。

本文以无向图为例,用邻接矩阵法来进行图的构建。

邻接矩阵(Adjacency Matrix):

        1.一个二维数组,用于表示节点之间的连接关系。这里 1 表示相连,0 表示不相连。
        2.如果节点 i 和节点 j 之间有边,则 matrix[i][j] 为 1(有向图)或 matrix[i][j] 和 matrix[j][i] 为 1(无向图)。

下面是一个图的例子:

首先我们来定义图结构体:

typedef struct Graph {
	char* vexs; //顶边的标签
	int** arcs; //顶点
	int vexsNum; //标签个数,也可以理解为顶点数
	int arcsNum; //边的个数
}Graph;

        这里vexs是字符串类型是char*,arcs是二级指针模拟二维数组,vexsNum是顶点个数,arcsNum是边的个数。

接着是创建图,为图开辟空间:

Graph* Graph_Init(int num) {
	Graph* G = (Graph*)malloc(sizeof(Graph));
	G->vexs = (char*)malloc(sizeof(char) * num);
	G->arcs = (int**)malloc(sizeof(int*) * num);
	for (int i = 0; i < num; i++) {
		(G->arcs)[i] = (int*)malloc(sizeof(int) * num);
	}
	G->vexsNum = num;
	G->arcsNum = 0;
	return G;
}

        为二级指针开辟vexsNum个一级指针,再为一级指针开辟vexsNum个int空间,这就是二级指针模拟二维数组。如果arcs[i][j]不为0,那么就边数+1,因为加了2遍,所以最后除以2。

void Graph_creat(Graph* G,char* vexs,int* data_vexs) {
	for (int i = 0; i < G->vexsNum; i++) {
		G->vexs[i] = vexs[i];
		for (int j = 0; j < G->vexsNum; j++) {
			G->arcs[i][j] = *(data_vexs + i * G->vexsNum + j);
			if (G->arcs[i][j] == 0) {
				G->arcsNum++;
			}
		}
	}
	G->arcsNum=G->arcsNum/2;
}

接下来就是BFS和DFS遍历:

广度优先搜索 (BFS)

        BFS 算法是从图的一个起始节点开始,探索所有邻居节点,然后逐层向外扩展。通常使用队列数据结构来实现。(类似于树的层级遍历,相当于广撒网)

我们可以写出一个类似于这样的代码:

void BFS(Graph* G,Queue* Q,int*visited,int index) {
    入队第一个顶点
	while (队列不为空)
	{
        出队取得顶点,并且打印顶点。
		for (int i = 0; i < G->vexsNum; i++) {
            //for循环寻找该顶点的相连顶点
			if (如果该顶点与另外一个顶点有联系 && 另外一个顶点没被访问过) {
                入队另外一个顶点
			}
		}
	}
}

        现在的主要问题是如何确定这个元素是否被访问过,我们需要标记访问过的元素。
        我们可以用一个数组来标记,例如如果访问过第二个元素,那么数组对应的位置array[1]就标记为1,其余仍然为0。在每次入队之后置为1,这样会避免多次入队多次访问。 

创建队列的函数就不再写了,最终代码如下:

void BFS(Graph* G,Queue* Q,int*visited,int index) {
	enQueue(Q, index);
	visited[index] = 1;
	while (!Isempty(Q))
	{
		index = deQueue(Q);
		printf("%c ", G->vexs[index]);
		for (int i = 0; i < G->vexsNum; i++) {
			if (G->arcs[index][i] == 1 && visited[i] != 1) {
				enQueue(Q, i);
				visited[i] = 1;
			}
		}
	}
}

深度优先搜索 (DFS)

        DFS 算法是从图的一个起始节点开始,沿着一个路径尽可能深入,然后回溯并探索其他路径。通常使用栈数据结构(递归调用栈或显式栈)来实现。这里用递归实现(相当于一条路走到黑,没路了再回去走其他路)。

我们可以先写出类似这样的代码:

void DFS(Graph* G, int* visited, int index) {
    接收访问顶点并且标记已访问
	for (int i = 0; i < G->vexsNum; i++) {
        //for循环寻找顶点的相连顶点
		if (如果和其他顶点有联系 && 其他顶点未访问) {
			DFS(G, visited, i);//递归其他顶点
		}
	}
}

最后我们可以写出下面的代码:

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] == 0) {
			DFS(G, visited, i);
		}
	}
}

这就是文章的全部内容了,希望对你有所帮助,如有错误欢迎指出。

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

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

相关文章

Redis的事务与关系型数据库事务有何不同?

引言&#xff1a;关于 Redis 的事务很多人可能都是一知半解&#xff0c;大多数人只了解数据库的事务&#xff0c;并且是单体事务&#xff0c;对于 Redis 事务和常见关系型数据库的事务的区别还没有去了解过&#xff0c;本文就来详细进行介绍。 题目 Redis的事务与关系型数据库…

git【工具软件】分布式版本控制工具软件

一、Git 的介绍 git软件的作用&#xff1a;管理软件开发项目中的源代码文件。 常用功能&#xff1a; 仓库管理、文件管理、分支管理、标签管理、远程操作 功能指令&#xff1a; add&#xff0c;commit&#xff0c;log&#xff0c;branch&#xff0c;tag&#xff0c;remote…

UE5 Mod Support 思路——纯蓝图

原创作者&#xff1a;Chatouille 核心功能 “Get Blueprint Assets”节点&#xff0c;用于加载未来的mod。用基础类BP_Base扩展即可。打包成补丁&#xff0c;放到Content\Paks目录下&#xff0c;即可让游戏访问到内容。 与文中所写不同的地方 5.1或者5.2开始&#xff0c;打…

mysql optimizer_switch : 查询优化器优化策略深入解析

码到三十五 &#xff1a; 个人主页 在 MySQL 数据库中&#xff0c;查询优化器是一个至关重要的组件&#xff0c;它负责确定执行 SQL 查询的最有效方法。为了提供DBA和开发者更多的灵活性和控制权&#xff0c;MySQL 引入了 optimizer_switch 系统变量。这个强大的工具允许用户开…

自动驾驶仿真(高速道路)LaneKeeping

前言 A high-level decision agent trained by deep reinforcement learning (DRL) performs quantitative interpretation of behavioral planning performed in an autonomous driving (AD) highway simulation. The framework relies on the calculation of SHAP values an…

Go微服务: 基于使用场景理解分布式之二阶段提交

概述 二阶段提交&#xff08;Two-Phase Commit&#xff0c;2PC&#xff09;是一种分布式事务协议&#xff0c;用于在分布式系统中确保多个参与者的操作具有原子性即所有参与者要么全部提交事务&#xff0c;要么全部回滚事务&#xff0c;以维持数据的一致性它分为两个阶段进行&…

3038. 相同分数的最大操作数目 I

题目 给你一个整数数组 nums&#xff0c;如果 nums 至少包含 2 个元素&#xff0c;你可以执行以下操作&#xff1a; 选择 nums 中的前两个元素并将它们删除。一次操作的分数是被删除元素的和。 在确保所有操作分数相同的前提下&#xff0c;请你求出最多能进行多少次操作。 …

数字IC后端物理验证PV | TSMC 12nm Calibre Base Layer DRC案例解析

基于TSMC 12nm ARM A55 upf flow后端设计实现训练营将于6月中旬正式开班&#xff01;小班教学&#xff01;目前还有3个名额&#xff0c;招满为止&#xff01;有需要可以私信小编 ic-backend2018报名。吾爱IC社区所有训练营课程均为直播课&#xff01; 这个课程支持升级成双核A…

李廉洋:6.7黄金亚盘洗盘暴跌,美盘最新分析策略。

黄金消息面分析&#xff1a;美联储降息可能是经济出现麻烦的信号。自去年10月以来&#xff0c;美国股市一直在上涨&#xff0c;原因是尽管利率持续走高&#xff0c;但美国经济和企业盈利仍保持强劲。如果市场对2024年下半年降息的信心增强&#xff0c;那么硬着陆的可能性就会增…

python-df的合并与Matplotlib绘图

1 数据连接 concat merge join &#xff08;append 作为了解&#xff09; append 竖直方向追加&#xff0c; 在最新的pandas版本中已经被删除掉了&#xff0c; 这里推荐使用concat 1.1 pd.concat 两张表&#xff0c; 通过行名、列名对齐进行连接 import pandas as pd df1 …

MS1112驱动开发

作者简介&#xff1a; 一个平凡而乐于分享的小比特&#xff0c;中南民族大学通信工程专业研究生在读&#xff0c;研究方向无线联邦学习 擅长领域&#xff1a;驱动开发&#xff0c;嵌入式软件开发&#xff0c;BSP开发 作者主页&#xff1a;一个平凡而乐于分享的小比特的个人主页…

【电路笔记】-分贝

分贝 分贝是以 10 为底的对数比,用于表示电路中功率、电压或电流的增加或减少。 1、概述 一般来说,分贝是响度的度量。 在设计或使用放大器和滤波器电路时,计算中使用的一些数字可能非常大或非常小。 例如,如果我们将两个放大器级级联在一起,功率或电压增益分别为 20 和…

嵌入式Linux系统编程 — 2.1 标准I/O库简介

目录 1 标准I/O库简介 1.1 标准I/O库简介 1.2 标准 I/O 和文件 I/O 的区别 2 FILE 指针 3 标准I/O库的主要函数简介 4 标准输入、标准输出和标准错误 4.1 标准输入、标准输出和标准错误概念 4.2 示例程序 5 打开文件fopen() 5.1 fopen()函数简介 5.2 新建文件的权限…

全程自动化操作 自动生成图文发布,矩阵批量软件系统 日产1-3万篇

一、简介 图文发布对于现代网站运营至关重要&#xff0c;然而手动创建和发布图文内容效率低下且易出错。全自动化图文生成发布流程可以解决这个问题。本文将详细说明如何以编程方式实现这一流程。 二、模块设计 该流程主要包含三个模块&#xff1a;图像生成&#xff0c;文本生成…

前端解析文件流格式数据异常时并给提示

把后端返回的文件流格式转换成正常数据格式 断点调试返回值 network查看返回值 一、blob类型 let stringData:any await this.blobToString(res); blobToString(blob) { return new Promise((resolve, reject) > { const reader new FileReader(); reader.onloadend (…

通过U盘将第三方软件安装到各大品牌电视的方法

在本教程中&#xff0c;小武给大家整理了通过U盘的方式安装第三方软件到电视盒子上&#xff0c;可直接使用通用U盘的方式来进行安装。 如果您相应电视品牌按通用方式无法完成需求&#xff0c;下面为您也贴心整理了20款主流智能电视和电视盒子的U盘安装指南。这些步骤适用于小米…

Vxe UI vxe-form 实现折叠表单,当表单很多时实现自动收起与展开

Vxe UI vue vxe-form 实现折叠表单&#xff0c;当表单很多时实现自动收起与展开 代码 folding 用于将当前表单项设置为默认隐藏 collapse-node 设置折叠按钮&#xff0c;加上之后会自动在该表单项的右侧显示一个折叠按钮 <template><div><vxe-formtitle-colo…

c++ EECS280

Introduction Euchre (pronounced “YOO-kur”) is a card game popular in Michigan. The learning goals of this project include Abstract Data Types in C, Derived Classes, Inheritance, and Polymorphism. You’ll gain practice with C-style Object Oriented Progr…

操盘手专栏 | 0-1搞懂TikTok广告优化该怎么玩!

如果你正想要或计划投放TikTok广告来提高杠杆效益&#xff0c;是否有面临下面的难题&#xff1a; 难找到系统的TikTok投放知识&#xff1f; 不懂得如何制定广告计划&#xff1f; 投放效果怎样才算有效优化&#xff1f; ...... 为此&#xff0c;超店有数邀请到了拥有8年营销…

新媒体暴力起号必备因素!沈阳新媒体运营培训学校

1周涨粉10w&#xff1f;这对普通人来说可以说是天文数字&#xff0c;但只要掌握方式方法&#xff0c;普通人也能做到&#xff01; 面试经验丰富的人都深知&#xff0c;给面试官留下的第一印象相当重要&#xff0c;几乎决定了80%的面试机会。标题也是如此&#xff0c;在完成一篇…