图的定义和术语72图的存储结构课件.pptx
《图的定义和术语72图的存储结构课件.pptx》由会员分享,可在线阅读,更多相关《图的定义和术语72图的存储结构课件.pptx(210页珍藏版)》请在三一办公上搜索。
1、7.1 图的定义和术语7.2 图的存储结构7.3 图的遍历7.4 图的连通性问题7.5 有向无环图及其应用 7.6 最短路径,第七章 图,图(Graph)由一个顶点集V和一个边集E构成的数据结构。 Graph = (V, E )其中,V = x | x 某个数据对象 是非空有限的顶点集合; E = (x, y) | x, y V 或 E = | x, y V Path (x, y)表示从 x 到 y 的一条单向通路, 它是有方向的,所以也叫做弧(arc)的集合,x称为弧尾或始点,y称为弧头或终点.,7.1 图的定义和术语,有向图有向图G是由两个集合V(G)和E(G)组成的其中:V(G)是顶点的
2、非空有限集 E(G)是有向边(也称弧)的有限集合,弧是顶点的有序对,记为,v,w是顶点,v为弧尾,w为弧头无向图无向图G是由两个集合V(G)和E(G)组成的 其中:V(G)是顶点的非空有限集 E(G)是边的有限集合,边是顶点的无序对,记为(v,w)或(w,v),并且(v,w)=(w,v),7.1 图的定义和术语,例7.1,图G1中:V(G1)=1,2,3,4,5,6 E(G1)=, , , , , , ,图G2中:V(G2)=1,2,3,4,5,6,7 E(G1)=(1,2), (1,3), (2,3), (2,4),(2,5), (5,6), (5,7),7.1 图的定义和术语,无向完全图(
3、Completed graph) n个顶点的无向图有n(n-1)/2条边(最大边数是n(n-1)/2)有向完全图n个顶点的有向图,有n(n-1)条边(最大边数是n(n-1) )稀疏图(sparse graph):边或弧很少的图,通常边数 nlog2n稠密图(Dense graph)无向图中,边数接近n(n-1)/2 ; 有向图中,边数接近n(n-1),7.1 图的定义和术语,有向完全图,7.1 图的定义和术语,无向图(树),有向图,完全图,无向 完全图,权与图的边或弧相关的数网带权的有向图叫有向网,带权的无向图叫无向网,7.1 图的定义和术语,子图如果图G(V,E)和图G(V,E),满足:VV
4、,EE 则称G为G的子图,7.1 图的定义和术语,邻接点(或相邻点),关联 如果 e=(u, v) 是 E(G) 中的一条边,则称 u 与 v 互为邻接顶点或相邻顶点;称边e与顶点u ,v 关联; 如果 e= 是 E(G) 中的一条弧,则称 u 邻接到v,v邻接于u,也称e与u,v关联;称弧e与顶点u ,v 关联;,7.1 图的定义和术语,顶点的度(于树的度不同)无向图中,顶点的度为与每个顶点相连的边数,记作TD(v)有向图中,顶点的度分成入度与出度入度:以该顶点为头的弧的数目,记为ID(v)出度:以该顶点为尾的弧的数目,记为OD(v)一个顶点的度数等于该顶点的入度与出度之和,即TD(v)=O
5、D(v)+ID(v),7.1 图的定义和术语,路径路径是顶点的序列V=Vi0,Vi1,Vin,满足(Vij-1,Vij)E 或 E,(1jn)路径长度沿路径边的数目或沿路径各边权值之和简单路径序列中顶点不重复出现的路径回路(环)第一个顶点和最后一个顶点相同的路径简单回路(简单环)除了第一个顶点和最后一个顶点外,其余顶点不重复出现的回路,7.1 图的定义和术语,7.1 图的定义和术语,V0V1V3V2,V0V1V3V2V0V1V2,V0V1V3V0,连通图与连通分量在无向图中, 若从顶点v1到顶点v2有路径, 则称顶点v1与v2是连通的。如果图中任意一对顶点都是连通的, 则称此图是连通图。非连通
6、图的极大连通子图叫做连通分量。,7.1 图的定义和术语,强连通图与强连通分量在有向图中, 若对于每一对顶点vi和vj, 都存在一条从vi到vj和从vj到vi的路径, 则称此图是强连通图。非强连通图的极大强连通子图叫做强连通分量。,强连通图,有向图G 有向图G的两个 强连通分量,7.1 图的定义和术语,生成树:是一个极小连通子图,它含有图中全部n个顶点,但只有n-1条边。如果在生成树上添加1条边,必定构成一个环若图中有n个顶点,却少于n-1条边,必为非连通图。,7.1 图的定义和术语,生成森林:由若干棵生成树组成,含全部顶点,但构成这些树的边是最少的。,有向图G的生成森林,有向图G,7.1 图的
7、定义和术语,本章只讨论简单图,有两类图形不在本章讨论之列:,7.1 图的定义和术语,图的抽象数据类型定义,ADT Graph 数据对象V:v是具有相同特性的数据元素的集合,称为顶点集。数据关系 R:R=VR;VR=|v,wV 且 P(v,w), 表示从v到w的弧, 谓词P(v,w)定义了弧的意义或信息基本操作P:,CreatGraph(&G, V, VR) / 按定义(V, VR) 构造图,DestroyGraph(&G): / 销毁图,基本操作,LocateVex(G, u); / 若G中存在顶点u,则返回该顶点在 图中“位置” ;否则返回其它信息。,GetVex(G, v); / 返回 v
8、 的值。,PutVex( / 对 v 赋值value。,FirstAdjVex(G, v); / 返回 v 的“第一个邻接点” 。若该顶点/在 G 中没有邻接点,则返回“空”。,NextAdjVex(G, v, w); / 返回 v 的(相对于 w 的) “下一个邻接 点”。若 w 是 v 的最后一个邻接点,则返回“空”。,基本操作,InsertArc( / 在G中增添弧,若G是无向的, /则还增添对称弧。,DeleteArc( /在G中删除弧,若G是无向的, /则还删除对称弧。,DeleteVex( / 删除G中顶点v及其相关的弧。,InsertVex( /在图G中增添新顶点v。,基本操作,
9、DFSTraverse(G, v, Visit()/从顶点v起深度优先遍历图G,并对每个顶点调用函数Visit一次且仅一次。,BFSTraverse(G, v, Visit()/从顶点v起广度优先遍历图G,并对每个顶点调用函数Visit一次且仅一次。,图的四种常用的存储形式:邻接矩阵和加权邻接矩阵(labeled adjacency matrix)邻接表十字链表邻接多重表,7.2 图的存储结构,一、(加权)邻接矩阵(labeled adjacency matrix),设图 G= 是一个有 n 个顶点的图,则图的邻接矩阵是一个二维数组 G.arcsnn,定义:,无向图G1,有向图G2,一、(加权
10、)邻接矩阵(continue),(1) 对称矩阵(可采用压缩存储);(2) 每一行(或列)1的个数是该顶点的度;(3) 主对角线全为0(简单图);,从邻接矩阵中可以反映图的许多特征:,无向图,一、(加权)邻接矩阵(continue),有向图,(1) 每一行1的个数是该顶点的出度;,(2) 每一列1的个数是该顶点的入度;,(3) 主对角线全为0(简单图);,有向图的邻接矩阵不一定对称。,定义为:,以有向网为例:,邻接矩阵:,N.Edge =,( v1 v2 v3 v4 v5 v6 ),顶点表:, 5 7 4 8 9 5 6 5 3 1 ,网络的邻接矩阵,一、(加权)邻接矩阵(continue),
11、容易实现图的操作,如:求某顶点的度、判断顶点之间是否有边(弧)、找顶点的邻接点等等。 n个顶点需要n*n个单元存储边(弧);空间效率为O(n2)。 对稀疏图而言尤其浪费空间。,邻接矩阵法优点:,邻接矩阵法缺点:,一、(加权)邻接矩阵(continue),#define INFINITY INT_MAX#define MAX_VERTEX_NUM 20typedef enumDG, DN,UDG,UDN GraghKind;typedef struct ArcCell / 弧的定义 VRType adj; / VRType是顶点关系类型。 / 对无权图,用1或0表示相邻否; / 对带权图,则为权
12、值类型。 InfoType *info; / 该弧相关信息的指针 ArcCell, AdjMatrixMAX_VERTEX_NUMMAX_VERTEX_NUM;,用邻接矩阵表示的图的存储表示(P161),typedef struct / 图的定义 VertexType vexsMAX_VERTEX_NUM;/ 顶点信息 AdjMatrix arcs; / 弧的信息 int vexnum, arcnum; / 顶点数,弧数 GraphKind kind; / 图的种类标志 MGraph;,用邻接矩阵表示的图的存储表示(continue),Status CreateUDN(Mgraph ,例:用邻
13、接矩阵生成无向网的算法(参见教材P162),scanf(/输入顶点值,存入一维向量中,for(i=0; iG.vexnum; +i) /对邻接矩阵n*n个单元初始化,adj=,info=NULL for(j=0;jG.vexnum;+j) G.arcsij=INFINITY, NULL;,for(k=0;kG.arcnum;+k) /给弧赋初值(循环次数弧数) scanf( G.arcsji = G.arcs i j; /无向网是对称矩阵 ,对于n个顶点e条弧的网,建网时间效率 = O(n2+n+e*n),int firstAdjVex(Mgraph G, int v) /返回顶点v的第一个邻
14、接点,G为无向图 for (k=0;k0 ) break;if (k=G.vexnum) k= -1; / 无邻接点return k;/ end firstAdjVex( ),图的部分操作在邻接矩阵上的实现,二、 邻接表 (Adjacency List),无向图的邻接表为每个顶点建立一个单链表,第i个单链表中的结点表示与顶点vi相邻的顶点,注:邻接表不唯一,因各个边结点的链入顺序是任意的。,data: 结点的数据域,保存结点的数据值。firstarc: 结点的指针域,给出自该结点出发的的第一条边 的边结点的地址。,头结点:,表结点:,adjvex: 该边或弧所指向的顶点的位置.nextarc:
15、 指向下一条边或弧的指针.,二、 邻接表 (Adjacency List),在无向图的邻接表中,如何求每个顶点的度?,若顶点数为n,边数为e时,则在无向图中共需多少 个结点?,二、 邻接表 (Adjacency List),n个头结点,2e个表结点,第 i 个链表中的结点个数是顶点 i 的度,有向图的邻接表和逆邻接表在有向图的邻接表中,第 i 个单链表链接的边都是顶点 i 发出的边。也叫做出边表。在有向图的逆邻接表中,第 i 个单链表链接的边都是进入顶点 i 的边。也叫做入边表。,邻接表(出边),逆邻接表(入边),0123,0123,用邻接表表示有向图时,若不考虑逆邻接表,只需 n 个顶点结点
16、,e 个边结点。,网络 (带权图) 的邻接表,带权图的边结点中保存该边上的权值 cost,邻接表表示的图的存储结构(P163),/边结点定义typedef struct ArcNode int adjvex; / 该弧所指向的顶点的位置 struct ArcNode *nextarc; / 指向下一条弧的指针 InfoType *info; / 该弧相关信息的指针 ArcNode;,adjvex info nextarc,/头结点定义typedef struct VNode VertexType data; / 顶点信息 ArcNode *firstarc; / 指向第一条依附该顶点的弧 VN
17、ode, AdjListMAX_VERTEX_NUM;,data firstArc,邻接表表示的图的存储结构(P163),/图的定义typedef struct AdjList vertices; int vexnum, arcnum; int kind; / 图的种类标志 ALGraph;,邻接表表示的图的存储结构(P163),图的操作在邻接连表的上的实现int firstAdjVex(ALGraph ghead ,int v) return gheadv-firstArc.adjvex;/ end firstAdjVex( )int nextAdjVex(ALGraph ghead,int
18、 v, int w) p=gheadv-firstArc;while (p/ end nextAdjVex( ),找某顶点的所有邻接点的时间复杂度是O(e),如何建立邻接表(以有向图为例),算法思想:首先将邻接表表头数组初始化,vertex域初始化为i,firstarc初始化为NULL;然后对读入的每一条弧,产生一个表结点,adjver域置为j,并将结点链接到邻接表的第i个链表中。,算法如下:,Void GreatAdjList(ALGraph / GreatAdjList,讨论:邻接表与邻接矩阵的比较,1. 联系:都可以用来存储有向图和无向图;邻接表中每个链表对应于邻接矩阵中的一行,链表中结
19、点个数等于一行中非零元素的个数。2. 区别:邻接矩阵是顺序结构,邻接表是链式结构对于任一确定的无向图,邻接矩阵是唯一的(行列号与顶点编号一致),但邻接表不唯一(链接次序与顶点编号无关)。邻接矩阵的空间复杂度为O(n2),而邻接表的空间复杂度为O(n+e)。邻接矩阵多用于稠密图的存储(e接近n(n-1)/2);而邻接表多用于稀疏图的存储(en2),三、 邻接多重表 (无向图的一种存储结构),在无向图的邻接表中,一条边出现两个单链表中.浪费空间,也给某种操作带来了困难。在邻接多重表中,每一条边只有一个结点(称边结点)为有关边的处理提供了方便。,mark ivex jvex ilink jlink,
20、其中:mark 是记录是否处理过的标记;ivex和jvex是依附于该边的两顶点位置。ilink域指向下一条依附于顶点ivex的边;jlink指向下一条依附于顶点jvex的边。需要时还可设置一个存放与该边相关的权值的域 cost。,边结点的结构,Ebox:,三、 邻接多重表 (无向图的一种存储结构),顶点结点的结构: 其中:data 存放与该顶点相关的信息;Firstarc 是指示第一条依附于该顶点的边的指针。存储顶点信息的结点表以顺序表方式组织.在邻接多重表中,所有依附于同一个顶点的边都链接在同一个单链表中。从顶点 i 出发, 可以循链找到所有依附于该顶点的边,也可以找到它的所有邻接顶点。,d
21、ata Firstarc,VexBox:,三、 邻接多重表 (无向图的一种存储结构),三、 邻接多重表 (无向图的一种存储结构),四、十字链表(有向图的一种存储结构),可以把十字链表看成是将有向图的邻接表和逆邻接表这两个表结合起来而得到的一种链表。在十字链表中,有向图中每一条弧对应一个结点(称弧结点)每一个顶点也对应一个结点(称顶点结点)。,其中: tailvex表示该弧的弧尾顶点在图中的位置; headvex表示该弧的弧头顶点在图中的位置; hlink指向弧头相同的下一条弧的指针; tlink指向弧尾相同的下一条边的指针。 需要时还可有权值域cost,边结点的结构,tailvex headv
22、ex hlink tlink,ArcBox:,四、十字链表(有向图的一种存储结构),顶点结点的结构,data Firstin Firstout,VexNode:,其中:数据域data存放与该顶点相关的信息,指针域Firstin指向以该顶点为弧头的第一条弧;指针域Firstout指向以该顶点为弧尾的第一条弧。,四、十字链表(有向图的一种存储结构),四、十字链表(有向图的一种存储结构),#define MAX_VERTEX_NUM 20Typedef struct ArcBox /弧结点结构 int tailvex , headvex ; struct ArcBox * hlink , tlink
23、; InfoType *info; ArcBox;Typedef struct VexNode /顶点结构 VertexType data; ArcBox * firstin,*firstout;VexNode; Typedef struct VexNode xlist MAX_VERTEX_NUM ; /表头向量 int vexnum, arcnum;OLGraph; /图结构,7.3 图的遍历,从已给的连通图中某一顶点出发,沿着一些边访问图中所有的顶点,且使每个顶点仅被访问一次,就叫做图的遍历 ( Graph Traversal )。,深度优先遍历,广度优先遍历,图的两种遍历方法,图中可能
24、存在回路,在访问完某个顶点之后可能会沿着某些边又回到了曾经访问过的顶点为了避免重复访问,可设置一个标志顶点是否被访问过的辅助数组 visited ,它的初始状态为 0,在图的遍历过程中,一旦某一个顶点 i 被访问,就立即让 visited i 为 1,防止它被多次访问。,7.3 图的遍历,DFS算法思想:,深度优先搜索DFS ( Depth First Search ),从图中某个顶点V0 出发,访问此顶点,然后依次从V0的各个未被访问的邻接点出发深度优先搜索遍历图,直至V0 的所有邻接点都被访问到。,若此时图中尚有顶点未被访问,则另选图中一个未曾被访问的顶点作起始点,重复上述过程,直至图中所
25、有顶点都被访问到为止。,深度优先搜索DFS ( Depth First Search ),深度优先搜索的示例,深度优先遍历生成树,图的深度优先遍历算法void dfsTraverse( )for (v=1; v=n; v+) visitedv=false;for (v=1; v=n; v+) if (!visitedv) dfs(v);void dfs(int v) visitedv=1; for (w=firstAdjVex(v); w; w=nextAdjVex(v,w)if (!visitedw) dfs(w); / 使用ADT,在递归函数中增加一计数器sum,初值为n,每访问一次就减1
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 定义 术语 72 存储 结构 课件

链接地址:https://www.31ppt.com/p-1462964.html