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

  欢~迎~光~临~^_^

目录

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.mzph.cn/news/82810.shtml

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

相关文章

密码学概论

1.密码学的三大历史阶段: 第一阶段 古典密码学 依赖设备,主要特点 数据安全基于算法的保密,算法不公开,只要破译算法 密文就会被破解, 在1883年第一次提出 加密算法应该基于算法公开 不影响密文和秘钥的安全&#xff…

vue3的双向绑定原理分析

谈到vue3的双向绑定原理,就得先知道,为什么vue2的双向绑定方式会被废弃? vue2的双向绑定 Object.defineProperty Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回…

添加一个仅管理员可见的页面

例如我新加一个页面 申请一个路由 《插播》 前端是如何知道我们是管理员的呢,ant-design框架会帮我们存到InitialState里,做为全局变量 在access.ts里我们获取到了用户是否为管理员 (用户存在且为管理员) 框架为我们打通了个路由…

JADE盲分离算法仿真

JADE算法原理 JADE 算法首先通过去均值预白化等预处理过程得到解相关的混合信号,预处理后的信号构建的协方差矩阵变为单位阵,为后续的联合对角化奠定基础;其次,通过建立四阶累积量矩阵,利用高阶累积量的统计独立性等性…

uniapp获取一周日期和星期

UniApp可以使用JavaScript中的Date对象来获取当前日期和星期几。以下是一个示例代码,可以获取当前日期和星期几,并输出在一周内的每天早上和晚上: // 获取当前日期和星期 let date new Date(); let weekdays ["Sunday", "M…

Android Aidl跨进程通讯(四)--接口回调,服务端向客户端发送数据

学更好的别人, 做更好的自己。 ——《微卡智享》 本文长度为3325字,预计阅读9分钟 前言 前几篇介绍了AIDL通讯的基础,进阶和异常捕获,本篇就来看看服务端怎么向客户端来实现发送消息。 实现服务端往客户端发送消息,主要…

java版Spring Cloud+Mybatis+Oauth2+分布式+微服务+实现工程管理系统

鸿鹄工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离构建工程项目管理系统 1. 项目背景 一、随着公司的快速发展,企业人员和经营规模不断壮大。为了提高工程管理效率、减轻劳动强度、提高信息处理速度和准确性,公司对内部工程管…

爬虫框架Scrapy学习笔记-1

前言 在现代互联网时代,网页数据获取和处理已经成为了重要的技能之一。无论是为了获取信息、做市场研究,还是进行数据分析,掌握网页爬取和数据处理技术都是非常有用的。本文将介绍从网页加载到数据存储的完整过程,包括网络请求、…

(手撕)数据结构--->堆

文章内容 目录 一:堆的相关概念与结构 二:堆的代码实现与重要接口代码讲解 让我们一起来学习:一种特殊的数据结构吧!!!! 一:堆的相关概念与结构 在前面我们已经简单的学习过了二叉树的链式存储结…

剑指YOLOv5改进主干RepViT系列: 最新重参数化结构|ICCV 2023 最新开源移动端网络架构 RepViT,1.3ms 延迟,速度贼快

💡本篇内容:剑指YOLOv5改进主干RepViT系列: 最新重参数化结构|ICCV 2023 最新开源移动端网络架构 RepViT,1.3ms 延迟,速度贼快 💡🚀🚀🚀本博客 改进源代码改进 适用于 YOLOv5 按步骤操作运行改进后的代码即可 💡:重点:该专栏《剑指YOLOv5原创改进》只更新…

SOA、分布式、微服务

SOA: SOA是一种软件设计架构,用于构建分布式系统和应用程序。它将应用程序拆分为一系列松耦合的服务,这些服务通过标准化的接口进行通信,并能够以可编程方式组合和重用。SOA的目标是提高系统的灵活性、可扩展性和可维护性。 特点&…

mac电脑部署安装powershell

部署安装powershell 要在mac部署安装powershell,可以使用homebrew来进行部署安装,故其步骤如下: 安装homebrew /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" 利用brew部署…

项目管理-甲方的心累

做了一年开发、四年的项目管理,近期公司接了一个第三方的平台,需要做私有化部署,负责的同事修婚假了,我替了2周,然后就好累好累,感觉需要自己亲力亲为去做每个项目经理要做的事情,但是又因为是不…

Linux Day17 生产者消费者

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

【MySQL系列】- MySQL自动备份详解

【MySQL系列】- MySQL自动备份详解 文章目录 【MySQL系列】- MySQL自动备份详解一、需求背景二、Windows mysql自动备份方法2.1 复制date文件夹备份实验备份环境创建bat直接备份脚本 2 .2 mysqldump备份成sql文件创建mysqldump备份脚本 2 .3 利用WinRAR对MySQL数据库进行定时备…

Android 白天黑夜模式设置

白天黑夜模式是一种动态的UI模式,根据当前时间或用户设置的偏好,在白天和黑夜之间进行切换。它通过调整应用程序的颜色、亮度和其他可视化元素来提供更加舒适和易读的用户界面。 一、简单设置 UiModeManager 是用于管理和控制用户界面模式(UI Mode)。它提供了一组方法,允…

【每日一题】154. 寻找旋转排序数组中的最小值 II

154. 寻找旋转排序数组中的最小值 II - 力扣(LeetCode) 已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组。例如,原数组 nums [0,1,4,4,5,6,7] 在变化后可能得到&#xff1…

CListCtrl控件为只显示一列,持滚动显示其他,不用SetScrollFlags

CListCtrl控件为只显示一列,持滚动显示其他,不用SetScrollFlags 2023/9/5 下午4:52:58 如果您不希望使用 SetScrollFlags 函数来设置滚动条样式,可以使用以下代码将 CListCtrl 控件设置为只显示一列,并支持滚动显示其他内容: cpp // 设置控件样式和属性 m_listCtrl.Se…

基于SSM的智慧城市实验室主页系统的设计与实现

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用Vue技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…

linux学习实操计划0103-安装软件

本系列内容全部给基于Ubuntu操作系统。 系统版本:#32~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Fri Aug 18 10:40:13 UTC 1 安装deb格式软件 Debian包是Unixar的标准归档,将包文件信息以及包内容,经过gzip和tar打包而成。 处理这些包的经典程序是…