【数据结构】图的基本概念,图的存储结构(邻接矩阵;邻接表;十字链表;邻接多重表)

news2024/11/25 3:39:14

  欢~迎~光~临~^_^

目录

1、图的基本概念

2、图的存储结构

2.1邻接矩阵

2.2邻接表 

2.3十字链表

2.4邻接多重表 

2.5图的四种存储结构的对比


1、图的基本概念

        图是由一组节点(通常称为顶点)和一组连接这些节点的边(通常称为边)组成的数据结构。图可以用于表示各种实际问题,如网络拓扑、道路系统、社交网络和电路等。

以下是图的一些基本概念:

  1. 顶点(Vertex):图中的节点。

  2. 边(Edge):图中连接顶点的线段。

  3. 有向图(Directed Graph):每条边都有一个指向性,即从一个顶点到另一个顶点的方向只能是一个方向。全部顶点的入度之和与出度之和相等。顶点的度等于其入度和出度之和。

  4. 无向图(Undirected Graph):边没有指向性,从一个顶点到另一个顶点的方向没有限制。全部顶点的度的和等于边的2倍。

  5. 边权(Edge Weight):边上附加的一个数值,代表两个顶点之间的距离或者权值。

  6. 度(Degree):一个顶点的度是指与该顶点相连的边的数目。在有向图中,度被分为入度和出度。

  7. 路径(Path):在图中,路径是通过边从一个顶点到另一个顶点的一系列顶点。

  8. 周长(Cycle):一个简单图中,如果从一个顶点出发经过若干边回到该顶点,称这个路径为周长。

  9. 连通图(Connected Graph):如果一个无向图中的任意两个顶点都可以通过一些边相连到达,则称该图为连通图。

  10. 强联通图(Strongly Connected Graph):对于有向图而言,如果任意两个顶点之间都存在双向路径,则称该图为强联通图。

  11. 带权图(Weighted Graph):图中的边带有权值或者距离。

  12. 子图(Subgraph):在一个图中取出一部分顶点和边所组成的图。

  13. 简单路径:顶点不重复出现的路径。

  14. 简单回路:除第一个顶点和最后一个顶点外,其余顶点不重复出现的回路。

  15. 连通分量:无向图中的极大连通子图。

  16. 强连通分量:有向图中的极大连通子图。

  17. 无向完全图:有n(n-1)/2条边。

  18. 有向完全图:有n(n-1)条边。

常见考点:

2、图的存储结构

2.1邻接矩阵

        邻接矩阵用一个二维数组来表示图中各个顶点之间的连通关系。邻接矩阵A的大小为nxn,其中A[i][j]表示节点i到节点j是否存在边,如果存在则为1,否则为0。

邻接矩阵的定义如下:

设 G=(V,E) 是一个无向图,其中 V={v1,v2,...,vn} 为顶点集合,E 为边集合。邻接矩阵 A 是一个 n×n 的矩阵,其中 A(i,j)=1 表示 vi 和 vj 之间有一条边,A(i,j)=0 表示 vi 和 vj 之间没有边。

对于有向图,邻接矩阵的定义稍有不同,具体如下:

设 G=(V,E) 是一个有向图,其中 V={v1,v2,...,vn} 为顶点集合,E 为边集合。邻接矩阵 A 是一个 n×n 的矩阵,其中 A(i,j)=1 表示存在一条从 vi 到 vj 的有向边,A(i,j)=0 表示不存在这样的有向边。

在C语言中,我们可以使用二维数组来实现邻接矩阵存储结构,结构定义如下:

#define MAX_VERTEX_NUM 100  // 定义图中顶点最大数量

typedef struct {
    int vertex[MAX_VERTEX_NUM];  // 存储顶点信息
    int edge[MAX_VERTEX_NUM][MAX_VERTEX_NUM];  // 存储边信息
    int vertexNum;  // 实际顶点数量
    int edgeNum;  // 实际边数量
} GraphMatrix;
 

        其中,`vertex`数组存储图中所有顶点的信息,`edge`数组存储边的信息,`vertexNum`和`edgeNum`分别表示实际顶点和边的数量。

        注意,使用邻接矩阵存储大型图时,可能会遇到空间限制的问题,因此需要针对具体情况酌情调整顶点数量的上限。

2.2邻接表 

图的邻接表是一种表示无向图或有向图的数据结构。它将每个顶点与与之相邻的顶点列表关联起来,其中每个顶点的邻居顶点列表都存储在该顶点对应的链表中。

例如,下面是一个无向图的邻接表表示:

0: 1 -> 2 -> 3
1: 0 -> 2
2: 0 -> 1 -> 3
3: 0 -> 2
 

        其中,每行表示一个顶点和它的邻居顶点列表。例如,第一行表示顶点0和它的邻居顶点1、2、3。

        在有向图的邻接表表示中,每个顶点的邻居顶点列表存储的是它的出边或入边,具体取决于是表示出度还是入度。

        邻接表适合表示稀疏图,因为它只存储了每个顶点的度数大小的信息,而对于度数较小的顶点,它所对应的链表长度也比较短。

 C语言,图的邻接表存储结构定义如下:

#define MAX_VERTEX_NUM 20 // 图中顶点的最大个数

// 边表结点
typedef struct ArcNode {
    int adjvex;             // 该弧所指向的顶点的位置
    struct ArcNode *next;   // 指向下一条弧的指针
    // 如果需要存储边的权值,可以在此处添加一个 weight 变量
} ArcNode;

// 顶点表结点
typedef struct VNode {
    char data;              // 顶点信息
    ArcNode *first;         // 指向第一条依附该顶点的弧的指针
} VNode, AdjList[MAX_VERTEX_NUM];

// 图
typedef struct {
    AdjList vertices;       // 邻接表
    int vexnum, arcnum;     // 图的顶点数和弧数
} ALGraph;
 

        在邻接表中,每个顶点都由一个顶点表结点表示,其中 data 为顶点信息,first 指向第一条依附该顶点的弧的指针。每个弧都由一个边表结点表示,其中 adjvex 指向该弧所指向的顶点在顶点表中的位置,next 指向下一条依附该顶点的弧的指针。同时,邻接表以一个包含图中所有顶点的顶点表结点数组表示。

2.3十字链表

        图的十字链表是一种存储无向图或有向图的方式,它使用链表来表示图中的节点和边。它的特点是每个节点维护四个指针,分别指向它的出边、入边、右边和下边。这样,我们可以快速访问每个节点的邻居节点和以该节点为起点或终点的边。

具体来说,每个节点维护四个指针:

1. 出边指针:指向以该节点为起点的第一条边。

2. 入边指针:指向以该节点为终点的第一条边。

3. 右边指针:指向与该节点在同一层级的下一个节点。

4. 下边指针:指向与该节点在下一层级的相邻节点,通常用于存储节点的入度信息。

        这种存储方式在图的遍历和其他算法中具有很好的效率,尤其是对稀疏图而言。因此,在实际应用中,十字链表常被用于表示稀疏图和网络。

 C语言,图的十字链表存储结构的定义:

#define MAX_VERTEX_NUM 20 // 最大顶点数

// 边表结构体定义
typedef struct ArcNode {
    int tailvex; // 弧尾
    int headvex; // 弧头
    struct ArcNode* hlink; // 指向同一个弧头的下一条边
    struct ArcNode* tlink; // 指向同一个弧尾的下一条边
    // 其他信息,如权值等
} ArcNode;

// 顶点表结构体定义
typedef struct VexNode {
    char data; // 顶点信息
    ArcNode* firstin; // 指向以该顶点为弧头的第一条边
    ArcNode* firstout; // 指向以该顶点为弧尾的第一条边
} VexNode;

// 十字链表存储结构体定义
typedef struct {
    VexNode vexs[MAX_VERTEX_NUM]; // 顶点表
    int vexnum; // 当前图的顶点数
    int arcnum; // 当前图的边数
} OLGraph;
 

2.4邻接多重表 

        邻接多重表是一种表示无向图的数据结构,它通过将每个顶点和边都表示为一个结点,并对它们进行链表连接来存储图。

邻接多重表的结构如下:

1. 图中每个顶点都有一个结点,包含以下信息:

- data:顶点的数据元素。
- firstedge:指向与该顶点相连的第一条边的指针(即链表中的头结点)。

2. 图中每条边都有一个结点,包含以下信息:

- mark:标记此边是否被访问过。
- ivex:该边连接的另一个顶点的位置(下标)。
- ilink:指向与该顶点相连的下一条边的指针。
- jvex:该边连接的另一个顶点的位置(下标)。
- jlink:指向与该顶点相连的下一条边的指针。

邻接多重表的优点是:

- 可以快速查找一个顶点的所有邻接点和边。
- 可以快速删除一个图中的点和边。
- 占用的存储空间比邻接表和邻接矩阵更少。

邻接多重表的缺点是:

- 不方便进行图的遍历。
- 在插入一个新顶点时,需要为其分配两个结点,因此需要更多的存储空间。

 C语言,图的邻接多重表存储结构的定义:

#define MAX_VERTEX_NUM 20  // 最大顶点数

typedef struct ArcNode {  // 边表结点
    int ivex, jvex;  // 该边依附的两个顶点在顶点表中的位置
    struct ArcNode *ilink, *jlink;  // 分别指向依附这两个顶点的下一条边
} ArcNode;

typedef struct VNode {  // 顶点表结点
    char data;  // 顶点信息
    ArcNode *firstarc;  // 指向第一条依附该顶点的边的指针
} VNode;

typedef struct {  // 邻接多重表
    VNode vertices[MAX_VERTEX_NUM];  // 顶点表
    int vexnum, arcnum;  // 图的当前顶点数和边数
} AMLGraph;
 

        该结构体定义了一个邻接多重表,其中顶点表的每个元素是一个VNode结构体,表示一个顶点。VNode结构体中包含了指向以该顶点为起点的第一条边的指针firstarc。边表结点ArcNode表示一条边,其中包含了ivex和jvex两个顶点在顶点表中的位置,以及指向依附这两个顶点的下一条边的指针ilink和jlink。

2.5图的四种存储结构的对比

 

🤞❤️🤞❤️🤞❤️图的知识点总结就到这里啦,如果对博文还满意的话,劳烦各位大佬儿动动“发财的小手”留下您对博文的赞和对博主的关注吧🤞❤️🤞❤️🤞❤️

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

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

相关文章

注册中心的学习

一、什么是注册中心? 注册中心主要有三种角色: 1.1、服务提供者(RPC Server): 在启动时,向 Registry 注册自身服务,并向 Registry 定期发送心跳汇报存活状态。 1.2、服务消费者(…

Qt5开发及实例V2.0-第七章-Qt图形视图框架

Qt5开发及实例V2.0-第七章-Qt图形视图框架 第7章 Qt 5图形视图框架7.1 图形视图体系结构7.1.1 Graphics View的特点7.1.2 Graphics View的三元素7.1.3 GraphicsView的坐标系统 7.2 【实例】:图形视图7.2.1 飞舞的蝴蝶7.2.2 地图浏览器7.2.3 图元创建7.2.4 图元的旋转…

大数据-kafka学习笔记

Kafka Kafka 是一个分布式的基于发布/订阅模式的消息队列(Message Queue),主要应用于大数据实时处理领域。 Kafka可以用作Flink应用程序的数据源。Flink可以轻松地从一个或多个Kafka主题中消费数据流。这意味着您可以使用Kafka来捕获和传输…

Python 图形化界面基础篇:创建顶部菜单

Python 图形化界面基础篇:创建顶部菜单 引言 Tkinter 库简介步骤1:导入 Tkinter 模块步骤2:创建 Tkinter 窗口步骤3:创建顶部菜单栏步骤4:处理菜单项的点击事件步骤5:启动 Tkinter 主事件循环 完整示例代码…

Python 如何把 String 转换为 Json 对象

在我们对 JSON 进行处理的时候,大概率我们会需要把字符串转换为 JSON 对象后才能进行处理。 Python 贴心的使用 json.loads(employee_string)就可以了。 首先需要做的就是导入 JSON 库。 #include json library import json 对现代程序员来说,JSON …

CNC 3D浮雕 Aspire 11.55 Crack

Aspire 提供了功能强大且直观的软件解决方案,用于在 CNC 铣床上创建和切割零件。有用于 2D 设计和计算 2D 刀具路径的工具,例如仿形、型腔加工和钻孔以及 2.5D 刀具路径,包括:V 形雕刻、棱镜雕刻、成型刀具路径、凹槽、 倒角刀具路…

抖音seo矩阵系统开源代码定制部署

抖音SEO底层开发逻辑主要包括以下几个方面: 1. 关键词优化:抖音SEO需要优化关键词,将关键词嵌入短视频标题、描述、标签等地方,提升抖音短视频在搜索引擎中的排名。 2. 标题优化:抖音短视频的标题应简明扼要&#xff…

C/C++满足条件的数的累加 2023年5月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析

目录 C/C满足条件的数的累加 一、题目要求 1、编程实现 2、输入输出 二、解题思路 1、案例分析 三、程序代码 四、程序说明 五、运行结果 六、考点分析 C/C满足条件的数的累加 2023年5月 C/C编程等级考试一级编程题 一、题目要求 1、编程实现 现有n个整数&#x…

【前端面试题】浏览器面试题

文章目录 前言一、浏览器面试问题1.cookie sessionStorage localStorage 区别2.如何写一个会过期的localStorage,说说想法2.如何定时删除localstorage数据2.localStorage 能跨域吗2.memory cache 如何开启2.localstorage的限制2.浏览器输入URL发生了什么2.浏览器如何…

IIC协议详解

目录 1.IIC协议概述 2.IIC总线传输 3.IIC-51单片机应用 1.起始信号 2.终止信号 3.应答信号 4.数据发送 4.IIC-32单片机应用 用到的库函数: 1.IIC协议概述 IIC全称Inter-Integrated Circuit (集成电路总线)是由PHILIPS公司在80年代开发的两线式串行总线&…

进程组.会话.终端

一.进程组.会话.终端概念 1.1进程组 在Linux操作系统中,进程组(Process Group)是一组进程的集合。进程组内的每个进程都有一个相同的进程组ID(PGID)。进程组可以用于进行作业控制、信号传递和进程状态管理等操作。 …

大模型+检索增强(RAG、Atlas 和 REPLUG)

https://zhuanlan.zhihu.com/p/651380539 https://github.com/ninehills/blog/issues/97 1. 检索增强生成 RAG 在问答和对话的场景下,通常可以通过检索和生成两种方式得到一个回复。检索式回复是在外部知识库中检索出满意的回复,较为可靠和可控&#…

如何使用 MATLAB 数学编程软件调用 Python 脚本详细教程(每周更新中)

MATLAB 读写操作 在 MATLAB 中,可以使用各种函数来读取和写入文件。其中,filename.txt 是要读取或写入的文件名,r 表示读取模式,w 表示写入模式。fscanf 和 fprintf 函数用于读取和写入文件内容,%c 和 %s 是格式说明符…

Python 通过 stomp 发送消息到 ActiveMQ 的代码

只需要下面简单的几行代码,我们就可以把我们本地数据发送到 ActiveMQ 上面去。 def send_mq(data):hosts [(AMQHOST, AMQPORT)]conn stomp.Connection(host_and_portshosts, auto_content_lengthFalse)conn.connect(usernameAMQUSER, passcodeAMQPASS, waitTrue)…

基于Spring Boot的医院预约挂号系统设计与实现

前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗 👇🏻…

功夫再高也怕菜刀。多年经验,会独立开发的机器视觉工程师,技术太强,但是找工作能力差劲

功夫再高也怕菜刀,专业的事情交给专业的人去做。 今年7月份中旬的时候,遇到一位老朋友,向我咨询某公司的信息,其实我根本不了解这家公司的情况与实力,向他说了,抱歉,我查下,等我晚上…

怎么把利用paddlepaddle导出的json文件转化为yolo或者voc文件

这两天想偷懒,想让模型先在数据上标一遍,然后我再做修正,主要是图个省事。由于我们的业务主要是利用paddle,模型也是基于paddle推理的,因此即便我对paddle有一万个吐槽但也不得不用它。但在利用paddle保存推理结果文件时&#xff…

Linux Day17 生产者消费者

一、生产者消费者问题概述 生产者 / 消费者问题,也被称作有限缓冲问题。两个或者更多的线程共享同一个缓冲 区,其中一个或多个线程作为 “ 生产者 ” 会不断地向缓冲区中添加数据,另一个或者多个线程作为 “ 消费者 ” 从缓冲区中取走数据。…

搭建本地MQTT服务器

环境及所用工具 win10本地环境下,使用docker配置一个mqttbroker,选择emqx docker操作:Docker_liangchaaaaa的博客-CSDN博客 测试使用MQTTX软件 Docker拉取镜像仓库 docker pull emqx/emqx:4.2.5 可以上官网看最新版本,或直接…

vue动态修改浏览器title和icon图标

vue动态修改浏览器title和icon图标 实例代码 setTitleIcon(){var link document.querySelector("link[rel*icon]") || document.createElement(link);link.type image/x-icon;link.rel shortcut icon;link.href /002.png; // 图片放public目录document.getElem…