第六章 图
6.1 图的定义和基本术语
图:G=(V,E) V:顶点(数据元素)的有穷非空集合;E:边的有穷集合。
无向图:每条边都是无方向的。
有向图:每条边都是有方向的。
![](https://i-blog.csdnimg.cn/blog_migrate/77f8b56fb8c74d1a42213020eca8f5e1.png)
完全图:任意两个点都有一条边相连
![](https://i-blog.csdnimg.cn/blog_migrate/176edbaeebf2fb97484c5a72993110b5.png)
稀疏图:有很少边或弧的图(e<nlogn)。
稠密图:有很多边或弧的图
网: 边/弧带权的图
邻接: 有边/弧相连的两个顶点之间的关系
存在(vi,vj),则称vi和vj互为邻接点;
存在<vi,vj>,则称vi邻接到vj,vj邻接于vi
关联(依附):边/弧与顶点之间的关系
存在(vi,vj)/<vi,vj>,则称该边/弧关联于vi和vj
顶点的度:与该顶点相关联的边的数目,记作TD(v)
在有向图中,顶点的度等于该顶点的入度和出度之和
顶点v的入度是以v为终点的有向边的条数,记作ID(V)
顶点v的出度是以v为终点的有向边的条数,记作OD(V)
例子:
![](https://i-blog.csdnimg.cn/blog_migrate/060860b26a472502d98faabd2c381190.png)
有向树
![](https://i-blog.csdnimg.cn/blog_migrate/58d921b9283486b5a07ac0cf4d6b120f.png)
路径:接续的边构成的顶点序列。
路径长度:路径上边或弧的数据/权值之和。
回路(环):第一个顶点和最后一个顶点相同的路径。
简单路径:除路径起点和终点可以相同外,其余顶点均不相同的路径。
简单回路(简单环):除路径起点和终点相同外,其余顶点均不相同的路径。
![](https://i-blog.csdnimg.cn/blog_migrate/d90a084364b1d9da53ce4de5b5213d76.png)
连通图(强连通图)
在无(有)向图G=(V, {E})中,若对任何两个顶点v,u都存在从v到u的路径,则称G是连通图(强连通图)
![](https://i-blog.csdnimg.cn/blog_migrate/910be498917e3b3eb303134425c8e5e7.png)
权与网:
图中边或弧所具有的相关数称为权。表明从一个顶点到另一个顶点的举例或耗费。
带权的图称为网。
子图:
设有两个图G=(V, {E})、G1=(V1, {E1}),若v1V,E1
E,则称G1是G的子图。
![](https://i-blog.csdnimg.cn/blog_migrate/5d43a5446b46c076fb490424378e8958.png)
连通分量(强连通分量)
无向图G的极大连通子图称为G的连通分量。
极大连通子图意思是:该子图是G的连通子图,将G的任何不在该子图中的顶点 加入,子图不再连通。
![](https://i-blog.csdnimg.cn/blog_migrate/9c3a40eb894d3ec7bc71cce3b3e8cc3a.png)
-
有向图G的极大强连通子图称为G的强连通分量
极大强连通子图意思是:该子图是G的强连通子图,将D的任何不在该子图中的顶点加入,子图不再连通。
![](https://i-blog.csdnimg.cn/blog_migrate/7381e56573cd06866bca90a3bbbcbd4f.png)
极小连通子图:该子图是G的连通子图,在该子图中删除任何一条边,子图不在连通
生成树:包含无向图G所有顶点的极小连通子图
生产森林:对非连通图,由各个连通分量的生成树的集合
![](https://i-blog.csdnimg.cn/blog_migrate/29a85582fea00b24f9e915fa8be2144c.png)
6.2 图的类型定义
ADT Graph{
数据对象V:具有相同特性的数据元素的集合,称为顶点集
数据关系R:R={
VR}
VR={
<v,w>|<v,w>|v,w∈V ∧ p(v,w),
<v,w>表示从v到w的弧,p(v,w)定义了弧(v,w)的信息
}
CreateGraph(&G,V,VR)
初始条件:V是图的顶点集,VR是图中弧的集合
操作结构:按V和VR的定义构造图G
DFSTraverse(G)
初始条件:图G存在
操作结构:对图进行深度优先遍历
BFSTraverse(G)
初始条件:图G存在
操作结构:对图进行广度优先遍历
}ADT Graph
6.3 图的存储结构
图的逻辑结构:多对多
图没有顺序存储结构,但可以借助二维数组来表示元素间的关系
数组表示法(临街矩阵)
链式存储结构:多重链表----->邻接表、邻接多重表、十字链表
重点介绍:邻接矩阵(数组)表示法、邻接表(链式)表示法
6.3.1 邻接矩阵
- 数组(邻接矩阵)表示法
- 建立一个顶点表(记录各个顶点信息)和一个邻接矩阵(表示各个顶点之间关系)。
- 设图A=(V,E)有n个顶点,则
![](https://i-blog.csdnimg.cn/blog_migrate/6a72080e971b651c88681a6736788c17.png)
图的邻接矩阵是一个二维数组A.arcs [n] [n],定义为:
如果<i,j>∈E,或者(i,j)∈E A.arcs [i] [j]=1否则 A.arcs [i] [j]=0。
无向图的邻接矩阵
![](https://i-blog.csdnimg.cn/blog_migrate/9660e2758863bae160509bad7d2b33bc.png)
分析1:无向图的邻接矩阵是对称的
分析2:顶点i的度 = 第i行(列)中1的个数
特别:完全图的邻接矩阵中,对角元素为0,其余1
有向图的邻接矩阵
![](https://i-blog.csdnimg.cn/blog_migrate/534914071a8a35a9b8c8524b24c09bf7.png)
注:在有向图的邻接矩阵中
第i行的含义:以结点vi为尾的弧(即出度边)
第i列的含义:以结点vi为头的弧(即入度边)
分析1:有向图的邻接矩阵可能是不对称的
分析2:顶点的出度 = 第i行元素之和
顶点的入度 = 第i列元素之和
顶点的度 = 第i行元素之和 + 第i列元素之和
网(权图)的邻接矩阵
定义为:
![](https://i-blog.csdnimg.cn/blog_migrate/adfe95d9f29a1b044ee766453da43a78.png)
邻接矩阵存储表示
用两个数组分别存储顶点表和邻接矩阵