C语言的数据结构:图的基本概念

news2024/10/5 21:21:07

前言

之前学过了其它的数据结构,如:
集合 \color{#5ecffd}集合 集合 —— 数据元素属于一个集合。
线型结构 \color{#5ecffd}线型结构 线型结构 —— 一个对一个,如线性表、栈、队列,每一个节点和其它节点之间的关系 一个对一个 \color{orange}一个对一个 一个对一个
树型结构 \color{#5ecffd}树型结构 树型结构 —— 一个对多个,如树。

现在要接触一下图这个结构了,图是多个对多个的结构,其没有初始结点,也没有最终结点。每一个节点都称为顶点。
图 \color{#5ecffd}图 ——因为图是若干个顶点,顶点之间相互连接,没有先后顺序,所以图没有顺序存储结构,但可以借助二维数组来表示元素间的关系( 邻接矩阵 \color{orange}邻接矩阵 邻接矩阵)。链式存储结构也可以描述图: 邻接表、邻接多重表、十字链表 \color{orange}邻接表、邻接多重表、十字链表 邻接表、邻接多重表、十字链表

邻接矩阵

存储表示:用两个数组分别存储 顶点表 \color{orange}顶点表 顶点表 邻接矩阵 \color{orange}邻接矩阵 邻接矩阵

#define MAZINT 32767	//极大值
#define MVNUM 100		//最大顶点数
typedef char VerTexType;	//设顶点的数据类型为字符型
typedef int ArcType;		//假设边的权值类型为整型

typedef struct {
	VerTexType vexs[MVNUM];		//顶点表
	ArcType	arcs[MVNUM][MVNUM];	//邻接矩阵
	int vexnum,arcnum;			//图的当前点数和边数
}AMGraph;

图的定义和术语

Graph = (Vertex,Edge)
G = (V,E)
V:Vertex 顶点,描述:顶点数据有有穷非空集合。
E:Edge 边,描述:边的有空集合。

🚲有向图:每条边都是有方向的

🚲无向图:每条边都是无方向的

🚲无向完全图:其中任意一点,都和其余所有点相连接(无方向)。

V1 和 V2、V3、V4 相互连接
V2 和 V1、V3、V4 相互连接
V3 和 V1、V2、V4 相互连接
V4 和 V1、V2、V3 相互连接

n 个顶点, n ( n − 1 ) / 2 条边 \color{orange}n个顶点,n(n-1)/2条边 n个顶点,n(n1)/2条边
解释:(n-1):求单个顶点的最大边数
如果有A、B、C三个顶点
则A 的最大边数:A 和 B连,A 和 C 连。 = 2条(因为A无法和自己相连,所以单个顶点的最大边数 = 所有顶点数-自身 = n-1

解释:n(n-1):求所有顶点的最大边数之和
(n-1)为单个顶点的最大边数,乘以n 就为所有顶点的最大边数之和

解释:n(n-1)/2:边数
已经求出 n(n-1) 为所有顶点的最大边数之和,假设有三个顶点A、B、C。
A的最大边数为A 和 B连,A 和 C 连
B的最大边数为B 和 A连,B 和 C 连
可以看出来吗?第一次A和B连,第二次B和A连,其实重复了,边只有一个,但计算了两次。/2 的目的是为了消除所有单条边计算了两次的问题

🚲有向完全图:其中任意一点,都和其余所有点相连接(有方向)。

注意:有向图是每两个点有两条边相连,而不是一条双箭头的边
n 个顶点, n ( n − 1 ) 条边 \color{orange}n个顶点,n(n-1)条边 n个顶点,n(n1)条边
V1 和 V2、V3、V4 相互连接
V2 和 V1、V3、V4 相互连接
V3 和 V1、V2、V4 相互连接
V4 和 V1、V2、V3 相互连接

n 个顶点, n ( n − 1 ) 条边 \color{orange}n个顶点,n(n-1)条边 n个顶点,n(n1)条边
解释:因为每两个顶点有两条边,把 /2去掉就行了。

🚲连通图

含义:所有的顶点都可以通过直接或间接的方式,到达任意一个顶点
无向图的连通图

有向图的连通图

🚲非连通图

含义:有一个或大于一个的顶点,无法到达所有顶点,或无法被所有顶点到达任意一个顶点。
可以看到从V2无法到达任何一个顶点。
有向图的非连通图

无向图的非连通图

🛴有向图

稀疏图 \color{orange}稀疏图 稀疏图: 有很少边或弧的图(e < n l o g n n_{log}n nlogn)。
稠密图 \color{orange}稠密图 稠密图:有较多边或弧的图。
网 \color{orange} 网 :        边/弧带权的图。
邻接 \color{orange}邻接 邻接:有边/弧相连的两个顶点之间的关系。
            存在( V i , V j V_i,V_j Vi,Vj),则称 V i V_i Vi V j V_j Vj互为邻接点;
            存在< V i , V j V_i,V_j Vi,Vj>,则称 V i V_i Vi邻接到 V j V_j Vj V j V_j Vj邻接于 V i V_i Vi
关联(依附) \color{orange}关联(依附) 关联(依附):边/弧与顶点之间的关系。
          存在( V i , V j V_i,V_j Vi,Vj)/< V i , V j V_i,V_j Vi,Vj>,则称该边/弧关联于 V i 和 V j V_i和V_j ViVj
顶点的度 \color{orange}顶点的度 顶点的度:与该顶点相关联的边的数量,记为TD(V)
有向图的入度 \color{orange}有向图的入度 有向图的入度:其它顶点指向该顶点的边数。
有向图的出度 \color{orange}有向图的出度 有向图的出度:该顶点指向其它顶点的边数。
有向图 \color{orange}有向图 有向图中,顶点的度为该顶点的 入度 \color{orange}入度 入度 出度 \color{orange}出度 出度的和。

路径 \color{orange}路径 路径:连接的边构成的顶点序列。
路径长度 \color{orange}路径长度 路径长度:路径上 (边或弧的数目/权值之和)。
回路 ( 环 ) \color{orange}回路(环) 回路():第一个顶点和最后一个顶点相同的路径。
简单路径 \color{orange}简单路径 简单路径:除路径起点和终点可以相同,其余顶点均不相同的路径。
简单路径 ( 简单环 ) \color{orange}简单路径(简单环) 简单路径(简单环):除路径起点和终点相同外,其余顶点均不相同的路径。

权 \color{orange}权 :图中边或弧所具有的相关数称为权。表明从一个顶点到另一个顶点的距离或耗费。
网 \color{orange}网 :带权的图称为网。
子图 \color{orange}子图 子图:设有两个图G=(V,{E})、G1=(V1,{E1})、若 V 1 ∈ V , E 1 ∈ E , 则称 G 1 是 G 的子图。 V1\in V,E1 \in E,则称G1是G的子图。 V1V,E1E,则称G1G的子图。
极大连通子图 \color{orange}极大连通子图 极大连通子图:该子图是G的连通子图,将G图分成多个子图,其中一个子图每个顶点都可以连接,若将一个子图中的顶点移入到该子图,则该子图的这个顶点无法与任意一个顶点相互连通,则称该子图为极大连通子图。
连通分量(强连通分量) \color{orange}连通分量(强连通分量) 连通分量(强连通分量):无向图G的极大连通子图称为G的连通分量。
极小连通子图 \color{orange}极小连通子图 极小连通子图:该子图是G的连通子图,在该子图中删除任何一条边,则该子图不再连通。
生成树 \color{orange}生成树 生成树:包含无向图G所有顶点的极小连通子图。
生成森林 \color{orange}生成森林 生成森林:对非连通图,由各个连通分量的生成树的集合。

图的操作

CreateGraph(*G,V,VR)

初始条件: V是图的顶点集,VR是图中弧的集合。
操作结果:按V和VR的定义 构造图 G \color{orange}构造图G 构造图G

DFSTraverse(G)

初始条件: 图G存在。
操作结果:对图进行 深度优先遍历 \color{orange}深度优先遍历 深度优先遍历

BFSTraverse(G)

初始条件: 图G存在。
操作结果:对图进行 广度优先遍历 \color{orange}广度优先遍历 广度优先遍历

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

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

相关文章

【Linux】生物信息学常用命令

参考资料来自生信技能树 先输入echo export PS1"[\033]2;\h:\u \w\007\033[33;1m]\u \033[35;1m\t\033[0m [\033[36;1m]\w[\033[0m]\n[\e[32;1m]$ [\e[0m]" >> ~/.bashrc 再输入source ~/.bashrc就能够让命令字体带上颜色&#xff0c;同时命令将会在下一行开…

Spark on k8s 源码解析执行流程

Spark on k8s 源码解析执行流程 1.通过spark-submit脚本提交spark程序 在spark-submit脚本里面执行了SparkSubmit类的main方法 2.运行SparkSubmit类的main方法&#xff0c;解析spark参数&#xff0c;调用submit方法 3.在submit方法里调用doRunMain方法&#xff0c;最终调用r…

LiveNVR监控流媒体Onvif/RTSP用户手册-视频广场:状态记录、播放、回放入口、筛选在线离线、搜索

LiveNVR监控流媒体Onvif/RTSP用户手册-视频广场:状态记录、播放、回放入口、筛选在线离线、搜索 1、视频广场1.1、搜索筛选1.2、状态记录1.3、播放1.4、视频信息1.5、回放入口 2、RTSP/HLS/FLV/RTMP拉流Onvif流媒体服务 1、视频广场 1.1、搜索筛选 可以下拉筛选 在线、离线 &a…

小红书 达芬奇:生活问答 AI 机器人

小红书去年 9 月开始内测的生活问答 AI 机器人&#xff1a;达芬奇&#xff0c;现在可以在小红书 APP 上用了 得益于小红书平台的特性&#xff0c;该助手擅长吃、住、宠、喝、学等等各类生活知识&#xff0c;目前还在搞活动&#xff0c;写评测笔记最高得 666 元

《后端程序猿 · 基于 Lettuce 实现缓存容错策略》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; 近期刚转战 CSDN&#xff0c;会严格把控文章质量&#xff0c;绝不滥竽充数&#xff0c;如需交流&#xff…

LinkedList底层原理

LinkedList特有方法 源码分析

Redis 缓存预热、缓存雪崩、缓存击穿、缓存穿透业务实践

0、前言 本文所有代码可见 > 【gitee code demo】 本文会涉及 缓存预热、缓存雪崩、缓存击穿、缓存穿透介绍和解决方案业务实践 1、缓存预热 1.1、描述 提前将热点数据加载到缓存&#xff0c;提前响应&#xff0c;降低后端数据源访问压力 1.2、实践 Autowiredprivate R…

Python基础002

Python数据类型 1、字符串&#xff08;str&#xff09; str3 """I miss you so much""" print("str3 ", str3,type(str3)) str3 I miss you so much <class str>2、整数&#xff08;int&#xff09; str1 55 print(&quo…

什么是定时器?

前言&#x1f440;~ 上一章我们介绍了阻塞队列以及生产者消息模式&#xff0c;今天我们来讲讲定时器 定时器 标准库中的定时器 schedule()方法 扫描线程 手动实现定时器 任务类 存储任务的数据结构 定时器类 如果各位对文章的内容感兴趣的话&#xff0c;请点点小赞&am…

【postgresql】数据库操作

创建数据库 使用 CREATE DATABASE SQL 语句来创建 语法&#xff1a; CREATE DATABASE dbname; 使用 createdb 命令来创建 语法&#xff1a; createdb [option...] [dbname [description]] 参数说明&#xff1a; dbname&#xff1a;要创建的数据库名。 description&…

手机电脑能实现无缝共享的记事软件是什么

在这个信息爆炸的时代&#xff0c;记事软件已成为我们日常生活中不可或缺的工具。然而&#xff0c;我曾深深困扰于手机与电脑之间记事内容无法无缝共享的问题。 记得有一次&#xff0c;我在手机上匆匆记下了一个重要的想法&#xff0c;打算稍后在电脑上展开。但当我坐在电脑前…

实战whisper第三天:fast whisper 语音识别服务器部署,可远程访问,可商业化部署(全部代码和详细部署步骤)

Fast Whisper 是对 OpenAI 的 Whisper 模型的一个优化版本,它旨在提高音频转录和语音识别任务的速度和效率。Whisper 是一种强大的多语言和多任务语音模型,可以用于语音识别、语音翻译和语音分类等任务。 Fast Whisper 的原理 Fast Whisper 是在原始 Whisper 模型的基础上进…

C语言的数据结构:图的操作

&#x1f6fa;图的遍历&#xff1a; 注意&#xff1a;在遍历的过程中&#xff0c;可能会出现 回路 ( 已经访问过的节点还要重新访问一次 ) \color{orange}回路(已经访问过的节点还要重新访问一次) 回路(已经访问过的节点还要重新访问一次). 当从A开始访问时&#xff0c;先访问…

「实战应用」如何用DHTMLX将上下文菜单集成到JavaScript甘特图中(二)

DHTMLX Gantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表。可满足项目管理应用程序的所有需求&#xff0c;是最完善的甘特图图表库。 DHTMLX Gantt是一个高度可定制的工具&#xff0c;可以与项目管理应用程序所需的其他功能相补充。在本文中您将学习如何使用自定义上…

秒懂设计模式--学习笔记(4)【创建篇-工厂方法模式】

目录 3、工厂方法模式3.1 介绍3.2 工厂的多元化与专业化3.3 游戏角色建模(建模)3.4 简单工厂不简单(实例化、初始化)3.5 制定工业制造标准3.6劳动分工 3、工厂方法模式 3.1 介绍 程序设计中的工厂类往往是对对象构造、实例化、初始化过程的封装&#xff0c;而工厂方法&#x…

【AIGC评测体系】大模型评测指标集

大模型评测指标集 &#xff08;☆&#xff09;SuperCLUE&#xff08;1&#xff09;SuperCLUE-V&#xff08;中文原生多模态理解测评基准&#xff09;&#xff08;2&#xff09;SuperCLUE-Auto&#xff08;汽车大模型测评基准&#xff09;&#xff08;3&#xff09;AIGVBench-T2…

昇思25天学习打卡营第6天|关于函数与神经网络梯度相关技术探讨

目录 Python 库及 MindSpore 相关模块和类的导入 函数与计算图 微分函数与梯度计算 Stop Gradient Auxiliary data 神经网络梯度计算 Python 库及 MindSpore 相关模块和类的导入 Python 中的 numpy 库被成功导入&#xff0c;并简称为 np。numpy 在科学计算领域应用广泛&#x…

借教室(题解)

P1083 [NOIP2012 提高组] 借教室 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 思路&#xff1a;二分前缀和 我们将和质检员那题差不多&#xff0c;只需要将候选人二分即可 #include<bits/stdc.h> using namespace std; #define int long long int n,m; int r[100000…

精准检测,守护安全:可燃气体报警器检测范围探讨

随着工业化进程的加快&#xff0c;易燃易爆气体的使用日益普遍&#xff0c;其安全隐患也愈发凸显。可燃气体报警器作为一种重要的安全监测设备&#xff0c;能够在气体泄漏时及时发出警报&#xff0c;预防火灾和爆炸事故的发生。 在这篇文章中&#xff0c;佰德将对可燃气体报警…

Docker搭建MySQL双主复制详细教程

在此之前需要提前安装好Docker和 Docker Compose 。 一、创建目录 首先创建一个本地数据挂载目录。 mkdir -p master1-data master2-data二、编写docker-compose.yml version: 3.7services:mysql-master1:image: mysql:5.7.36container_name: mysql-master1environment:MYSQL_…