当前位置: 首页 > news >正文

数据结构入门-图的基本概念与存储结构

前言

        图和树都是图论的内容,树是特殊的图。数据结构中的图论部分和离散数学有大量重叠,代码内容占少数,定义占多数,平时多看两眼可以帮助记忆。

图的定义

图是由顶点(vertex)的有穷非空集合和顶点之间的边(eage)的集合组成的。

通常记为G(V,E),其中G表示一个图,V是图G中顶点的集合,E是边的集合。

V(G)和E(G)通常分别表示图G的顶点和边集合。

注意:对于图这种数据结构,不允许没有顶点,但边集可以为空。

 无向图与有向图

V(G)={0,1,2,3}

E(G)={(0,1),(0,2),(0,3),(1,2),(1,3),(2,3)}

无向图边集用圆括号表示

V(G)={0,1,2}

E(G)={<0,1>,<1,2>,<1,0>}

有向图边集用尖括号表示 

边也称为弧,有向图的弧由弧尾指向弧头。

 简单图与多重图

限制一:图中不能有从顶点到其自身的边。

限制二:同一条边再图中不能出现两次或者两次以上。

不满足以上两条限制的图称为多重图。

 在数据结构的学习中,如果没有特殊提及,我们所学习的所有图都是指简单图。

完全图

 完全图:具有最多边数的图称为完全图。

对于一个具有n个顶点的无向完全图,边数量的最大值尾n(n-1)/2

对于一个具有n个顶点的有向完全图,边数量的最大值为n(n-1)

 

 路径和路径长度

路径:从一个顶点开始,经过一系列的边到达另外一个顶点形成的顶点序列。

路径长度:路径上边的条数。

回路(环):起点和终点相同,路径{0,3,1,0}是一个回路(环)。

 

 简单路径

简单路径:如果路径中不出现相同的顶点,则称为简单路径。

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

 顶点的度

度:对于无向图,顶点的度指的是与顶点相关联边的数目。

入度:在有向图中,对于顶点v,箭头指向v的边的数目。

出度:在有向图中,对于顶点v,从该顶点出发的边的数目。

 

 度与边的关系

在无向图中,假设具有n个顶点,e条边

图中所有顶点度之和等于边数的两倍

对于有向图,所有顶点的出度之和与入度之和相等,弧的数量也相等。

子图

图G的子图H,H满足V(H)是V(G)子集且E(H)是E(G)子集。

 

 连通图

连通:在无向图中,如果从顶点v到顶点w有路径,则称顶点v到顶点w是连通的。

如果对于图中任意两个顶点都是连通的,则称此图为连通图。

 连通分量

无向图中的极大连通子图称为连通分量

连通分量为子图

子图为连通图

连通子图含有极大顶点数

具有极大顶点数的连通子图包含依附于这些顶点的所有边。

 

强连通图

强连通图:在有向图中,对于每一对顶点v和w,从v到w和从w到v都有路径,则称该有向图为强连通图。

有向图中顶点极大强连通子图称为有向图的强连通分量。

 

 生成树

生成树:指含有图中全部顶点的极小连通子树。

注意:包含所有顶点n,但只有足以构成一棵树的n-1条边。

 边的权和网

在一个图中,每条边可以标注上一个代表某种含义的数值,该数值称为这个边的权值网;边上带有权值的图,也称为带权图。

 图的存储结构

 邻接矩阵-无向

 将上面的图以两个数组的形式存储起来:

 

 在两个顶点之间,如果有连线,就用1表示,无连线就用0表示。

无向图的邻接矩阵具有按对角线对称的性质。

邻接矩阵-有向

 

 

 

 邻接矩阵-带权值

 

在带权图的边数组中,用∞符号来表示两个边之间没有关系,用权值来表示该边的权。 

邻接表-无向

 

 

 邻接表中用链表来表示每个顶点的关系,用数组下标来标记顶点,头节点是该顶点,链表节点中存储的数字是与该顶点相连的顶点下标。

邻接表-有向

 

 在这个邻接表中节点存储的都是出边的对应顶点,逆邻接表则存储入边的对应顶点。

逆邻接表

 

 十字链表

 

 tailvex表示弧尾,headvex表示弧头,headlink指向该节点被弧头链接的顶点的节点,tailink指向被弧尾链接的顶点的节点。

 如上图第一个链表的首节点中,0和3就代表从顶点V0指向顶点V3的一条边。

 在上述链表中,用横向链接的节点表示出边关系,用纵向链接的节点表示入边关系,横纵交错,构成十字链表。

邻接多重表

 

 ivex和jvex是某一条便连接的两个顶点的下标

ilink指同连接顶点ivex的下一条边

jlink指同连接顶点jvex的下一条边

 

 

先给出四个顶点的节点和五条边的节点。

 

按照每个顶点的顺序依次连接节点 。这样就解决了无向图的邻接表过于冗杂的问题。

http://www.lqws.cn/news/587125.html

相关文章:

  • 数据结构与算法分析课设:一元多项式求值
  • STM32-第一节-新建工程,GPIO,点亮LED,蜂鸣器
  • 零成本接入+企业级部署:2025年AI大模型实战指南
  • 某只股票量化对冲策略计算绘图
  • 利用不坑盒子的Copilot,快速排值班表
  • JSON-LD 开发手册
  • 探索 AI 系统提示与模型资源库:`system-prompts-and-models-of-ai-tools`
  • 门控循环单元(GRU):LSTM 的轻量级高效 “记忆专家”
  • Android Liunx ffmpeg交叉编译
  • 自己电脑搭建本地服务器并实现公网访问,内网也能提供互联网连接使用
  • 零基础学土壤物理建模|Hydrus2D、Hydrus3D实操教程+参数设置技巧
  • 【算法】动态规划 70: 爬楼梯
  • ue xr 系统
  • 飞算 JavaAI 深度实战:从老项目重构到全栈开发的降本增效密码
  • 【Spring AI】 1接入 Ollama实践
  • 周赛98补题
  • C/C++ 使用rapidjson库 操作Json格式文件(创建、插入、解析、修改、删除)
  • 【数论 构造】 P11036 【MX-X3-T3】「RiOI-4」GCD 与 LCM 问题|普及+
  • 高效读取文件中指定行段的两种方法
  • mysql运维语句
  • C++ Vector的使用(下)
  • Qt Hello World 程序
  • ES6从入门到精通:箭头函数
  • C++ Vector的使用(上)
  • Linux基础环境开发工具apt、vim和gcc/g++
  • Excel 中拖动公式时,如何让引用的单元格“固定”或“变动”?
  • Vue3——项目配置eslint+prettier
  • Instruct-GPT奖励模型的损失函数与反向传播机制解析
  • [15-2] 读写内部FLASH读取芯片ID 江协科技学习笔记(20个知识点)
  • 【C++指南】C++ list容器完全解读(三):list迭代器的实现与优化