1.07k likes | 1.21k Views
数 据 结 构. 第七章 图. 7.1 图的定义和术语 7.2 图的存储结构 7.3 图的遍历 7.4 图的连通性问题 7.5 有向无环图及其应用 7.6 最短路径. 7.1 图的定义和术语. 一、图的定义 图 G 由两个集合组成,即 G=(V,E) 。其中 V 是顶点的有穷非空集合(图中的数据元素通常称作顶点), E 是两个顶点之间关系的集合。. v 1. v 2. v 4. v 3. 例如: G 1 =(V 1 ,E 1 )
E N D
第七章 图 7.1 图的定义和术语 7.2 图的存储结构 7.3 图的遍历 7.4 图的连通性问题 7.5 有向无环图及其应用 7.6 最短路径
7.1 图的定义和术语 一、图的定义 • 图G由两个集合组成,即G=(V,E)。其中V是顶点的有穷非空集合(图中的数据元素通常称作顶点),E是两个顶点之间关系的集合。
v1 v2 v4 v3 例如:G1=(V1,E1) V1={v1,v2,v3,v4},E1={<v1,v2>,<v1,v3>,<v3,v4>,<v4,v1>} 有序对<vi,vj> :用以vi为起点、以vj为 终点的有向线段表示,称为有向边或弧; 其中称vi为弧尾或初始点,称vj为弧头 或终端点,此时的图称为有向图。 有向图
v1 v2 v3 v5 v4 例如:G2=(V2,E2) V2={v1,v2,v3,v4 ,v5} E2={(v1,v2),(v1,v4),(v2,v3),(v2,v5), (v3,v4) ,(v3,v5)} 无序对(vi,vj) :用连接顶点 vi,vj的线段表示,称为无向边或边; 此时的图称为无向图。 无向图
图的逻辑特征:图中的每一个顶点可以有零个或多个直接前驱;图中的每一个顶点可以有零个或多个直接后继;图的逻辑特征:图中的每一个顶点可以有零个或多个直接前驱;图中的每一个顶点可以有零个或多个直接后继; • 基本操作:
二、基本术语 • 完全图、稠密图和稀疏图:若用n表示图G中的顶点数目,用e表示边的数目,不考虑顶点到其自身的边,则若G是无向图,e的取值范围是0到n(n-1)/2;若G是有向图,e的取值范围是0到n(n-1)。有n(n-1)/2条边的无向图称为完全图,具有n(n-1)条弧的有向图称为有向完全图。当一个图有较少的边或弧,称它为稀疏图,反之为稠密图。
邻接点:在一个无向图中,若存在一条边(vi,vj),则称顶点vi和vj互为邻接点,或称顶点vi和vj相邻接。并称边(vi,vj)依附于顶点vi和vj,或称边(vi,vj)和顶点vi和vj相关联。邻接点:在一个无向图中,若存在一条边(vi,vj),则称顶点vi和vj互为邻接点,或称顶点vi和vj相邻接。并称边(vi,vj)依附于顶点vi和vj,或称边(vi,vj)和顶点vi和vj相关联。 同理,在有向图中,若存在一条弧<vi,vj>,则称顶点vi邻接到顶点vj,顶点vj邻接自顶点vi,并称弧<vi,vj>和顶点vi和vj相关联。 • 顶点的度:无向图中顶点v的度是和顶点v相关联的边的数目,记作TD(v)。有向图中以顶点v为弧头的弧的数目称作顶点v的入度,记作ID(v),以顶点v为弧尾的弧的数目称作顶点v的出度,记作OD(v),顶点v的度TD(v)=ID(v)+OD(v)。
子图:设图G1=(V1,E1)和图G2=(V2,E2),若V2⊆V1且E2⊆E1,则称图G2是图G1的子图。子图:设图G1=(V1,E1)和图G2=(V2,E2),若V2⊆V1且E2⊆E1,则称图G2是图G1的子图。 • 路径、简单路径和回路:在无向图G中,若存在一个顶点序列vi,vk1,vk2,…,vkn,vj使得(vi,vk1),(vk1,vk2),…,(vkn,vj)均属于E,则称顶点vi和vj存在一条路径vi,vk1,vk2,…,vkn,vj,若图是有向的,则路径也是有向的。 第一个顶点和最后一个顶点相同的路径称为回路或环。序列中顶点不重复出现的路径称为简单路径。除了第一个顶点和最后一个顶点之外,其余顶点不重复出现的回路,称为简单路径或简单环。
连通图和连通分量:无向图G中,如果从顶点vi到顶点vj有路径,则称顶点vi和vj是连通的。如果对于图G中的任意两个顶点vi和vj都是连通的,则称G是连通图。无向图的极大连通子图称为无向图的连通分量。连通图和连通分量:无向图G中,如果从顶点vi到顶点vj有路径,则称顶点vi和vj是连通的。如果对于图G中的任意两个顶点vi和vj都是连通的,则称G是连通图。无向图的极大连通子图称为无向图的连通分量。 • 强连通图和强连通分量:有向图G中,如果对于每一对顶点vi和vj,从vi到vj和从vj到vi都有路径,则称G是强连通图。有向图的极大强连通子图称为有向图的强连通分量。
生成树和生成森林:一个连通图的生成树是一个极小连通子图,它含有图中全部顶点,但只有足以构成一棵树的n-1条边。在非连通图中,由每个连通分量都可以得到一个极小连通子图,即一个生成树,这些连通分量的生成树就组成了一个非连通图的生成森林。生成树和生成森林:一个连通图的生成树是一个极小连通子图,它含有图中全部顶点,但只有足以构成一棵树的n-1条边。在非连通图中,由每个连通分量都可以得到一个极小连通子图,即一个生成树,这些连通分量的生成树就组成了一个非连通图的生成森林。 如果一个有向图恰有一个顶点的入度为0,其余顶点的入度均为1,则是一棵有向树,一个有向图的生成森林由若干棵有向树组成,含有图中的全部顶点,但只有足以构成若干棵不相交的有向树的弧。 • 权和网:若给图的每条边或弧赋一个有意义的数称为权,带权的图称为网。
v1 v2 v1 v2 v3 v3 完全图 有向完全图
v1 v2 v1 v2 v3 v4 v3 v4 v5 无向图G2 有向图G1 一个有n个顶点,e条边或弧的图中,e与顶点的度之间的关系是什么? ?
v1 v2 v3 v4 v1 v2 v1 v1 v2 v2 v1 v2 v3 v3 v4 v5 v4 v4 v4 v5 v5 v5 v1
v1 v2 v1 v2 v3 v4 v3 v4 v5 无向图G2 有向图G1
A B C D E F G H K I J L M 无向图G3
A B D E C F G H K I J L M 所谓极大是指连通分量中顶点数最多,再添加任何一个顶点就会使之变为非连通图。
v1 v4 v3 v1 v2 v4 v3 有向图G1 v2
A B A B C C F F J L J M L M 所谓极小是指连通分量中边数最少,若在生成树中去掉任何一条边都会使之变为非连通图,若在生成数上任意添加一条边,就必会出现回路。
C D A B 有向图G4 A B C E F E D F
C 5 3 3 7 6 8 D 9 4 A B 网 2 10 E F
7.2 图的存储结构 一、数组表示法 用两个数组分别存储数据元素(顶点)的信息和数据元素之间的关系(边或弧)的信息。其中顶点的信息用一维数组实现,边或弧的信息用二维数组来实现。表示边或弧的信息的二维数组称为邻接矩阵。
设G=(V,E)是具有n个顶点的图,则G的邻接矩阵是具有如下性质的n阶方阵:设G=(V,E)是具有n个顶点的图,则G的邻接矩阵是具有如下性质的n阶方阵:
v1 v2 v3 v5 v4 无向图G2 无向图的邻接矩阵的性质? (1)无向图的邻接矩阵是一个对称矩阵。 (2)无向图中,顶点vi的度是邻接矩阵中第i行(或第i列)的元素之和; ?
v1 v2 v4 v3 有向图G1 有向图的邻接矩阵的性质? 有向图中,顶点vi的入度是邻接矩阵中第i列的元素之和,顶点vi的出度是邻接矩阵中第i行的元素之和。 ?
图的邻接矩阵表示法的特点: (1)无向图的邻接矩阵是一个对称矩阵。 (2)无向图中,顶点vi的度是邻接矩阵中第i行(或第i列)的元素之和; (3)有向图中,顶点vi的入度是邻接矩阵中第i列的元素之和,顶点vi的出度是邻接矩阵中第i行的元素之和。 (4)若邻接矩阵中元素aij的值为1,则vi和vj之间有边或弧相连。 (5)图G的邻接矩阵的空间复杂度为O(n2),只与顶点数n有关,与边数无关,适合于表示稠密图。
图的数组表示法的类型描述: #define max 50 typedef char vextype; typedef struct { vextype vexs[max]; int arcs[max][max]; int vexnum; int arcnum; }MGraph;
网的邻接矩阵可以定义为: • 其中wij为权值
5 C 3 3 7 6 8 9 4 D 2 10 A B E F
二、邻接表 图的邻接表存储结构是将顺序存储结构和链式存储结构相结合的一种存储结构,即对图中的每个顶点vi,将所有邻接于vi的顶点vj连接成一个单链表,这个单链表就称为顶点vi的邻接表,再将所有顶点的邻接表的表头放在一个数组中,就构成了图的邻接表存储结构
在邻接表表示法中有两种结点结构,如下所示:在邻接表表示法中有两种结点结构,如下所示: 表头结点 表结点 指示与顶点vi邻接的点在图中的位置 存放顶点的信息 存放下一个结点的地址 存放邻接表中的第一个结点的地址
A B C D E 无向图G2 ^ ^ ^ ^ ^ ? 在无向图的邻接表中第i个链表中结点的个数即为第i个顶点的度 无向图的邻接表的性质?
A B D C 有向图G1 ^ ^ ^ ^ 有向图的邻接表 ? 在有向图的邻接表中第i个链表中结点的个数即为第i个顶点的出度 有向图的邻接表的性质?
A B D C 有向图G1 ^ ^ ^ ^ 有向图的逆邻接表 在有向图的逆邻接表中第i个链表中结点的个数即为第i个顶点的入度 ? 有向图的逆邻接表的性质?
图的邻接表表示法的类型描述 #define max 50 typdef char vextype; typedef struct ArcNode{ int adjvex; struct ArcNode *nextarc; }ArcNode; typedef struct{ vextype data; ArcNode *firstarc; }VNode,AdjList[max];
typedef struct{ AdjList vertices; int vexnum; int arcnum; }ALGraph;
7.3 图的遍历 • 从图中某一顶点出发访遍图中其余顶点,且使每一个顶点仅被访问一次,这一过程就叫做图的遍历。根据遍历路径的不同,通常有两种遍历图的方法: • 深度优先遍历(深度优先搜索) • 广度优先遍历(广度优先搜索)
一、深度优先遍历 • 基本思想: 假设初始状态是图中所有顶点未曾被访问,则深度优先遍历可以从图中某个顶点v出发,访问此顶点,然后依次从v的未被访问的邻接到出发深度优先遍历图,直到图中所有和v有路径相通的顶点都被访问到;若此时图中尚有顶点未被访问,则另选图中一个未曾被访问的顶点作为起始点,重复上述过程,直到图中所有顶点都被访问到为止。
v1 v2 v3 • 对上图假设从v1出发进行深度优先遍历所得到的遍历序列为: v4 v5 v6 v7 v8 v5 v6 v7 v1 v2 v4 v8 v3 深度优先遍历序列或DFS序列
v1 v5 v6 v2 v3 v4 v7 v8 • 练习:写出从顶点v1出发深度优先遍历序列 • 深度优先遍历序列为: v1 v2 v4 v8 v5 v6 v3 v7
分别以邻接矩阵和邻接表作为图的存储结构,给出连通图的深度优先遍历的递归算法分别以邻接矩阵和邻接表作为图的存储结构,给出连通图的深度优先遍历的递归算法 • 算法思想: (1)访问出发点vi,并将其标记为已访问过。 (2)遍历vi的的每一个邻接点vj,若vi未曾访问过,则以vi为新的出发点继续进行深度优先遍历。 • 算法实现:
? • 如何实现非连通图的深度优先遍历?
A B C D E F G H K I J L M • 写出从顶点A出发对下图进行深度优先遍历的遍历序列。 • 深度优先遍历序列为:ALMJBFC DE GKHI
二、广度优先遍历 • 基本思想: 假设初始状态是图中所有顶点未曾被访问,则广度优先遍历可以从图中某个顶点v出发,在访问了v之后依次访问v的各个未曾访问过的邻接点,然后分别从这些邻接点出发依次访问它们的邻接点,并使“先被访问的顶点的邻接点”先于“后被访问的顶点的邻接点”被访问,直到图中所有已被访问的顶点的邻接点都被访问到;若此时图中尚有顶点未被访问,则另选图中一个未曾被访问的顶点作为起始点,重复上述过程,直到图中所有顶点都被访问到为止。
v1 v2 v3 • 对上图假设从v1出发进行广度优先遍历所得到的遍历序列为: v4 v5 v6 v7 v8 v5 v7 v8 v1 v2 v3 v4 v6 广度优先遍历序列或BFS序列
v1 v5 v6 v2 v3 v4 v7 v8 • 练习:写出从顶点v1出发深度优先遍历序列 • 广度优先遍历序列为: v1 v2 v3 v4 v5 v6 v7 v8
分别以邻接矩阵和邻接表作为图的存储结构,给出连通图的广度优先遍历的算法分别以邻接矩阵和邻接表作为图的存储结构,给出连通图的广度优先遍历的算法 • 算法思想: (1)访问出发点v,并将其标记为已访问过; (2)顶点v入队; (3)while(队不空) {①取队首顶点i; ② 依次搜索顶点i的所有邻接点,若某一邻接点 j未被访问,则访问该邻接点,并将其入队 }
? • 如何实现非连通图的广度优先遍历?
A B C D E F G H K I J L M • 写出从顶点A出发对下图进行广度优先遍历的遍历序列。 • 广度优先遍历序列为:ABCFLMJ DE GHIK