一、图的定义
1. 图的定义
- 组成要素: 图G由顶点集V和边集E组成,记作G=(V,E)。其中V是有限的非空顶点集合,E是用顶点对表示的边集合。
- 表示方法: 数据结构中的数据元素用顶点表示,数据元素之间的关系用边表示。
- 与树的区别: 树中结点只能与上一层的一个父结点和下一层的多个子结点相连,而图中允许任意两个顶点之间存在关联。
1)有向图
- 边表示: 从顶点vi到vj的有向边表示为
,vi称为弧尾,vj称为弧头。
- 特点:⟨vi,vj⟩和⟨vj,vi⟩表示不同的边。例如顶点1到4的边和4到1的边是两条不同的边。
- 示例: 图中顶点集V={1,2,3,4},边集E={⟨1,2⟩,⟨1,3⟩,⟨1,4⟩,⟨4,1⟩,⟨4,2⟩}。
2)无向图
- 边表示: 顶点vi和vj之间的无向边表示为(vi,vj)。
- 特点:(vi,vj)和(vj,vi)表示同一条边。
- 示例: 图中顶点集V={1,2,3,4,5},边集E={(1,2),(1,3),(1,4),(2,3),(3,4),(3,5),(4,5)}。
二、图的相关概念
1. 完全图
- 无向完全图: 具有n个顶点且每个顶点与其他n−1个顶点都有边相连的图。边数为
。
- 有向完全图: 具有n个顶点且任意两个不同顶点之间存在方向相反的两条弧的图。弧数为n(n−1)。
- 推导过程: 无向完全图边数计算为1+2+...+(n-1)=
;有向完全图在此基础上每条边变为双向,故乘以2。
2. 度
- 定义: 与顶点相连的边的数量称为该顶点的度。
- 示例: 有向图a中顶点1的度为4(相连边数),无向图b中顶点1的度为3。
3. 出度和入度
- 定义: 仅适用于有向图,出度指从顶点出发的边数,入度指指向顶点的边数。
- 示例: 有向图a中顶点1的出度为3(流向2、3、4),入度为1(来自4);顶点4的出度为2,入度为1。
4. 路径
- 定义: 顶点序列中相邻顶点间存在边则构成路径,路径长度为经过的边数。
- 无向图路径: 如1-4-5路径长度为2,1-2-3-5路径长度为3。
- 有向图路径: 必须遵循边方向,如1→4→2是有效路径,但2→4不存在路径。
5. 子图
- 定义: 若图G′的顶点集V′是G的顶点集V的子集,且边集E′是E的子集,则G′是G的子图。
- 示例: 从无向图b中选取顶点{1,2,4}及其相连边{(1,2),(1,4)}可构成子图。
6. 连通图
- 无向连通图: 任意两个顶点间都存在路径的无向图。如图b是连通图。
- 强连通图: 有向图中任意两个顶点间双向都有路径。如图a不是强连通图(如顶点3无法到达其他顶点)。
7. 网
- 定义: 边带权值的图称为网,权值可表示距离、成本等实际意义。
- 应用: 如城市交通网中,顶点表示城市,边表示公路,权值表示里程或运输成本。
三、图的存储结构
1. 邻接矩阵表示法
1)邻接矩阵表示法定义
- 表示原理:用n×n矩阵表示n个顶点的图,矩阵元素a_{ij}表示顶点vi到vj的边存在性
- 元素取值:有边时a_{ij}=1,无边时a_{ij}=0,自环边(顶点到自身)恒为0
- 存储内容:同时存储顶点集合和边集合,矩阵行/列对应顶点,元素值对应边
- 有向图特点:矩阵不对称,a_{ij}与a_{ji}可能不同(如示例中a_{12}=1而a_{21}=0)
2)无向图的邻接矩阵表示法
- 对称性:矩阵关于主对角线对称,a_{ij}=a_{ji}(如示例中a_{12}=a_{21}=1)
- 对角线特征:主对角线元素均为0,表示无自环边
- 空间效率:实际只需存储上三角或下三角矩阵即可完整表示图结构
3)网带有权值的图的邻接矩阵的表示
- 权值表示:用矩阵元素直接存储边的权值(如a_{12}=5表示v1→v2权值为5)
- 无穷大约定:无边时用∞表示(区别于普通图的0),自环边仍为0
- 示例解析:图中a_{23}=4表示v2→v3权值为4,a_{32}=∞表示v3→v2无连接
2. 邻接链表表示法
1)邻接链表表示法定义
- 组成要素:
- 表头节点:包含顶点数据域(data)和指向第一条边的指针域(firstarc)
- 表节点:包含邻接顶点编号(adjvex)、边信息(info)和下一条边指针(nextarc)
- 存储方式:为每个顶点建立单链表,链表节点表示与该顶点直接相连的边/弧
2)无向图的邻接链表表示法
- 链表构建:每个顶点的链表包含所有相邻顶点(如顶点1的链表包含2→3→4)
- 对称关系:若顶点A的链表包含B,则B的链表必包含A(体现无向图特性)
- 空间优势:相比邻接矩阵更节省空间,尤其适合稀疏图(边数远少于n^2的图)
3)有向图的邻接链表表示法
- 方向性体现:链表仅存储以该顶点为起点的弧(如v0链表含1,2表示v0→v1和v0→v2)
- 逆邻接表:额外建立的表存储以该顶点为终点的弧(如v0在逆邻接表中含3表示v3→v0)
- 空链表情况:若顶点无出边(如示例v1),其链表为空
4)带权值的网的邻接链表表示法
- 节点扩展:表节点增加权值存储域(如v0→v1节点存储权值8)
- 表示方法:在adjvex后增加权值信息,形成三元组(邻接顶点,权值,下指针)
- 示例解析:v2v_2v2链表中的"3,2"表示v2→v3权值为2,v3链表中的"0,5"表示v3→v0权值为5
四、知识小结
|--------|-------------------------------------------------------------------------|-------------------------------------------|------|
| 知识点 | 核心内容 | 考试重点/易混淆点 | 难度系数 |
| 图的定义 | 由顶点集合V和边集合E组成,分为有向图(边带方向)和无向图(边无方向) | 树与图的区别:树是分层结构,同一层/跨层节点无连接;图允许任意节点互联 | ⭐⭐ |
| 图的分类 | - 无向图:边无方向(圆括号表示边) - 有向图:边有方向(尖括号表示弧) - 网:边带权值(如距离/成本) | 完全图:无向完全图边数=𝑛(𝑛−1)/2;有向完全图弧数=𝑛(𝑛−1) | ⭐⭐⭐ |
| 图的相关概念 | - 度:顶点连接的边数 - 出度/入度(有向图):流出/流入的边数 - 连通性:无向图任意两点有路径=连通图;有向图=强连通图 | 路径长度:路径经过的边数(易混淆:有向图需方向一致) | ⭐⭐ |
| 图的存储结构 | - 邻接矩阵:𝑛×𝑛矩阵,元素值表示边存在/权值(无向图矩阵对称) - 邻接链表:为每个顶点建单链表,存储相邻顶点及权值(网需额外权值域) | 邻接矩阵 vs 邻接链表:稠密图用矩阵省空间;稀疏图用链表省时间 | ⭐⭐⭐⭐ |
| 应用示例 | 城市交通网用网表示(顶点=城市,边=公路,权值=里程/成本) | 关键算法关联:最短路径(Dijkstra)、最小生成树(Prim/Kruskal) | ⭐⭐⭐ |