数据结构中的图.ppt
《数据结构中的图.ppt》由会员分享,可在线阅读,更多相关《数据结构中的图.ppt(67页珍藏版)》请在课桌文档上搜索。
1、,第7章 图(Graph),数 据 结 构(Data Structure),第七章 图,图是一种比线性表和树更为复杂的数据结构。在线性表中,数据元素之间仅有线性关系,每个元素最多只有一个直接前驱和一个直接后继。在树型结构中,数据元素之间存在明显的层次关系,并且每层的元素可能和下一层的多个元素相邻,但只能和上一层的一个元素相邻。而在图形结构中,结点之间的关系可以是任意的,图中的任意两个元素之间都可能相邻。图是计算机应用过程中对实际问题进行数学抽象和描述的强有力的工具,数据结构中对图的讨论侧重于在计算机中如何表示图以及如何实现图的操作和应用等。,第七章 图和广义表,7.1 图的定义和术语7.2 图
2、的存储结构7.3 图的遍历7.4 图的连通性问题7.5 有向无环图及其应用7.5.1 拓扑排序7.5.2 关键路径7.6 最短路径,7.1 图的定义和术语,图由一个顶点的有穷非空集合V(G)和一个弧的集合E(G)组成,通常记做G=(V,E)。图中的顶点即为数据结构中的数据元素,弧的集合E实际上是定义在顶点集合上的一个关系。用有序对表示从v到w的一条弧。弧具有方向性,以带箭头的线段表示,通常称v为弧尾或始点,称w为弧头或终点,此时的图称为有向图。若图中从v到w有一条弧,同时从w到v也有一条弧,则以无序对(v,w)代替这两个有序对和,表示v和w之间的一条边。此时的图在顶点之间不再强调方向性的特征,
3、称为无向图。,7.1 图的定义和术语,图G1是一个有向图,G1=(V1,A1)。其中:V1=A,C,B,F,D,E,G A1=,有向图G1,7.1 图的定义和术语,图G2是一个无向图,G2=(V2,E2)。其中:V2=A,B,C,D,E,F E2=(A,B),(A,C),(B,C),(B,E),(B,F),(C,F),(C,D),(E,F),(C,E),A,B,C,D,E,F,无向图G2,7.1 图的定义和术语,在实际应用中,图的弧或边往往与具有一定意义的数相关,称这些数为权(weight)。分别称带权的有向图和无向图为有向网和无向网。,1,2,3,4,5,6,7,1,2,3,4,5,6,7,
4、19,18,21,27,5,6,10,33,11,70,64,75,80,60,180,69,58,43,31,32,44,30,无向网,有向网,7.1 图的定义和术语,稀疏图和稠密图 假设用n表示图中顶点数目,用e表示边或弧的数目。若不考虑顶点到其自身的弧或边,则对于无向图,边数e的取值范围是0到n(n-1)/2。称具有n(n-1)/2条边的无向图为完全图。对于有向图,弧的数目e的取值范围是0到n(n-1)。称具有n(n-1)条弧的有向图为有向完全图。若enlogn,则称为稀疏图,反之称为稠密图。子图 假设有两个图G=(V,E)和G=(V,E),若V V且E E,则称G为G的子图。,7.1
5、图的定义和术语,度、入度和出度 若u-v是图中的一条弧,则称u邻接到v,或v邻接自u。图中所邻接到某顶点v的弧的数目,称为该顶点的入度,记作:ID(v);反之,从某顶点u出发的弧的数目,称为该顶点的出度,记作:OD(u)。顶点v的入度和出度之和称为该顶点的总度,简称为度,记作:TD(v)。例如图G1中顶点B的入度ID(B)=2,出度OD(B)=3,度TD(B)=5。无向图中顶点的度定义为与该顶点相连的边的数目。一般情况下,如果顶点vi的度记作TD(vi),则一个含有n个顶点,e条边或弧的图,满足如下关系:,7.1 图的定义和术语,路径和回路 若有向图G中k+1个顶点之间都有弧存在,则这个顶点的
6、序列v0,v1,vk为从顶点v0到顶点vk的一条有向路径,路径中弧的数目定义为路径长度。若序列中的顶点都不相同,则为简单路径。对无向图,相邻顶点之间存在边的k+1个顶点序列构成一条长度为k的无向路径。如若v0和vk是同一个顶点,则是一条由某个顶点出发又回到自身的路径,称这种路径为回路或环。,7.1 图的定义和术语,连通图和连通分量 若无向图中任意两个顶点之间都存在一条无向路径,则称该无向图为连通图。对有向图而言,若图中任意两个顶点之间都存在一条有向路径,则称该有向图为强连通图。非连通图中的各个极大连通子图称为该图的连通分量。,非强连通图和强连通分量,非连通图和连通分量,7.1 图的定义和术语,
7、图的抽象数据类型ADT Graph 数据对象V:V是具有相同特性的数据元素的集合,称为顶点集。数据关系R:R=VR VR=|v,wP(v,w),表示从到的弧,谓词P(v,w)定义了弧的意义或信息 基本操作:CreateGraph(&G,V,VR)初始条件:V是图的顶点集,VR是图中弧的集合。操作结果:按V和VR的定义构造图G。DestoryGraph(&G)初始条件:图G存在。操作结果:销毁图G。LocateVex(G,u)初始条件:图G存在,u和G中顶点有相同特征。操作结果:若G中存在顶点u,则返回该顶点在图中的位置;否则返回其他信息。,more,7.1 图的定义和术语,GetVex(G,v
8、)初始条件:图G存在,v是G中的某个顶点。操作结果:返回v的值。PutVex(&G,v,value)初始条件:图G存在,v是G中的某个顶点。操作结果:对v赋值value。FirstAdjVex(G,v)初始条件:图G存在,v是G中的某个顶点。操作结果:返回v的第一个邻接点,若该顶点在G中无邻接点,则返回空。NextAdjVex(G,v,w)初始条件:图G存在,v是G中的某个顶点,w是v的邻接顶点。操作结果:返回v的(相对于w的)下一个邻接点。若w是v的最后一个邻接点,则返回空。,more,7.1 图的定义和术语,InsertVex(&G,v)初始条件:图G存在,v和图中顶点有相同特征。操作结果
9、:在图G中增添新顶点v。DeleteVex(&G,v)初始条件:图G存在,v是G中的某个顶点。操作结果:删除G中顶点v及其相关的弧。InsertArc(&G,v,w)初始条件:图G存在,v和w是G中的两个顶点。操作结果:在图G中增添弧,若G是无向的,则还增添对称弧。DeleteArc(&G,v,w)初始条件:图G存在,v和w是G中的两个顶点。操作结果:在图G中删除弧,若G是无向的,则还删除对称弧。,more,7.1 图的定义和术语,DFSTraverse(G,v,visit()初始条件:图G存在,v是G中的某个顶点,visit是针对顶点的应用函数。操作结果:从顶点v起深度优先遍历图G,并对每个
10、顶点调用函数visit一次且仅一次。一旦visit()失败,则操作失败。BFSTraverse(G,v,visit()初始条件:图G存在,v是G中的某个顶点,visit是针对顶点的应用函数。操作结果:从顶点v起广度优先遍历图G,并对每个顶点调用函数visit一次且仅一次。一旦visit()失败,则操作失败。ADT Graph,7.2 图的存储结构,图是一种典型的复杂结构,图中顶点可能同任意一个其他顶点之间存在关系。因此,图没有顺序映象的存储结构。图有两种常用的存储结构。7.2.1 图的数组(邻接矩阵)存储表示 邻接矩阵是用于描述图中顶点之间的关系(及弧或边的权)的矩阵,假设图中顶点数为n,则邻
11、接矩阵A=(ai,j)m*n定义为:,Aij=,1 若Vi和Vj之间有弧或边存在,0 Vi和Vj之间没有弧或边存在,7.2.1 图的数组(邻接矩阵)存储表示,有向图G1,无向图G2,G1的邻接矩阵,G2的邻接矩阵,7.2.1 图的数组(邻接矩阵)存储表示,一般情况下,图中没有邻接到自身的弧,因此矩阵中主对角线全为零。由于无向图中一条边视为一对弧,则无向图的邻接矩阵必然是对称矩阵。网的邻接矩阵定义中,当vi到vj有弧相邻接时,ai,j的值为该弧上的权值,否则为。,7.2.1 图的数组(邻接矩阵)存储表示,有向图的邻接矩阵大多为稀疏矩阵,可以采用压缩存储表示。用二维数组表示更为方便,它和顶点信息等
12、其他图的信息一起构成图的一种存储表示const INFINITY_INT_MAX=MAX;/最大值设为MAXconst MAX_VERTEX_NUM=20;/最大顶点个数typedef enum DG,DN,AG,ANGraphKind;/图类型(有向图、有向网、无向图、无向网)typedef struct ArcCellVRType adj;/VRType为顶点的关系类型。对无权图,用1或0表示是否相邻;对带权图则为权值类型InfoType*info;/指向该弧相关信息的指针ArcCell,AdjMatrixMAX_VERTEX_NUMMAX_VERTEX_NUM;typedef struc
13、tVertexType vexsMAX_VERTEX_NUM;/描述顶点的数组AdjMatrix arcs;/邻接矩阵int vexnum,arcnum;/图的当前顶点数和弧(边)数GraphKind kind;/图的种类标志MGraph;,7.2.2图的邻接表存储表示,邻接表是图的一种链式存储表示方法,它类似于树的孩子链表。在有向图的邻接表中,从同一个顶点出发的弧链接在同一链表中,邻接表中结点的个数恰好为图中弧的个数。在无向图的邻接表中,同一条边有两个结点,分别出现在和它相关的两个顶点的链表中,因此无向图的邻接表中结点个数是边的两倍。,7.2.2图的邻接表存储表示,有向图G1,MAX_VER
14、TEX_NUM,7.2.2图的邻接表存储表示,MAX_VERTEX_NUM,无向图G2,7.2.2图的邻接表存储表示,邻接表定义如下:const MAX_VERTEX_NUM=20;typedef struct ArcNodeint adjvex;/该弧所指向的顶点的位置struct ArcNode*nextarc;/指向下一条弧的指针InfoType*info;/指向该弧相关信息的指针ArcNode;typedef struct VNodeVertexType data;/顶点信息ArcNode*firstarc;/指向第一条依附该顶点的弧VNode,AdjListMAX_VERTEX_NU
15、M;typedef structAdjList vertices;int vexnum,arcnum;/图的当前顶点数和弧数int kind;/图的种类标志ALGraph;,算法7.1void CreateUDG(ALGraph/for/CreateUDG,7.3 图的遍历,与二叉树和树的遍历类似,图结构也有遍历操作,即从某个顶点出发,沿着某条路径对图中其余顶点进行访问,且使每一个顶点只被访问一次。但图的遍历要比树的遍历更复杂,因为图中和同一顶点有弧或边相通的顶点之间可能也有弧或边,那么在访问了某个顶点之后,可能沿着某条回路又回到了该顶点。为了避免同一顶点被重复访问,则在遍历过程中,必须为已经
16、访问过的顶点加上标识,以便再次途径这样的顶点时不再重复访问。为此,需附设一维数组visited0.n-1,令其每个分量对应图中一个顶点,各分量的初值均设为FALSE或0,一旦访问了某个顶点,便将visited中相应分量的值置为TRUE或被访问时的序号。通常,对图进行遍历可有两种搜索路径:深度优先搜索和广度优先搜索。,7.3.1 深度优先搜索遍历图,深度优先搜索遍历类似于树的先根遍历,可以看成是先根遍历的推广。假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发,首先访问该顶点,然后依次从它的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和v有路径相通的顶点都被访问到,若此时尚有其
17、他顶点未被访问到,则另选一个未被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止。显然,深度优先搜索是一个递归的过程。,7.3.1 深度优先搜索遍历图,例如,从v3出发对下图进行深度优先搜索,首先访问顶点v3,然后从v3的邻接顶点v2出发进行深度优先搜索,先后访问v4、v9和v1,由于v3的第二个邻接顶点v1已经被访问过,则不再从v1出发进行搜索,而v3的下一个邻接点v6未被访问,则再从v6出发进行搜索。,搜索过程中访问顶点的次序为:v3-v2-v4-v9-v1-v6-v5-v8-v7,7.3.1 深度优先搜索遍历图,算法7.2 Boolean visitMAX;void DF
18、STraverse(Graph G,Status(*Visit)(int v)VisitFunc=Visit;for(v=0;vG.vexnum;v+)visitv=False;for(v=0;vG.vexnum;v+)if(!visitv)DFS(G,v);void DFS(Graph G,int v)/从第v个顶点出发递归地深度优先遍历图G visitedv=TRUE;VisitFunc(v);/访问第v个顶点 for(w=FirstAdjVex(G,v);w!=0;w=NextAdjVex(G,v,w)if(!visitw)DFS(w);/对v的尚未访问的邻接顶点w递归调用DFS/DFS
19、FirstAdjVex(G,v)返回图G中顶点v的第一个邻接点,NextAdjVex(G,v,w)返回图G中v相对于w的下一个邻接点,w!=0说明尚有邻接点存在。,7.3.1 深度优先搜索遍历图,在实际应用中,首先要为图选定存储结构,假设采用邻接表表示图,则算法7.2具体化为算法7.3。算法7.3void DFS(ALGraph G,int v)/从第v个顶点出发递归地深度优先遍历图G visitv=TRUE;VisitFunc(G.verticesv.data);for(p=G.verticesv.firstarc;p;p=p-nextarc;)w=p-adjvex;if(!visitedw
20、)DFS(G,W);/对v未访问过的邻接顶点w递归调用DFS/for/DFS,7.3.1深度优先搜索遍历图,查找的顺序为:1、2、4、8、5、6、3、7,1,1,1,1,1,1,1,1,1,7.3.2 广度优先搜索遍历图,广度优先搜索的基本思想是:从图中某顶点v出发,在访问了v之后依次访问v的各个未曾访问过的邻接点,然后分别从这些邻接点出发依次访问它们的邻接点,并使得“先被访问的顶点的邻接点先于后被访问的顶点的邻接点被访问,直至图中所有已被访问的顶点的邻接点都被访问到。如果此时图中尚有顶点未被访问,则需要另选一个未曾被访问过的顶点作为新的起始点,重复上述过程,直至图中所有顶点都被访问到为止。换
21、句话说,广度优先搜索遍历图的过程是以v为起点,由近至远,依次访问和v有路径相通且路径长度为1,2.的顶点。,7.3.2 广度优先搜索遍历图,例如,从v3开始对下图进行广度优先搜索遍历的过程为:首先访问v3和v3的邻接点v2、v1和v6,然后依次访问v2的邻接点v4和v6的邻接点v5,接着访问v4的邻接点v9,最后访问v5的邻接点v8和v7。由于这些顶点的邻接点都已经被访问,并且图中所有顶点都已被访问到,广度优先遍历至此结束。,一层,二层,三层,访问序列为:v3-v2-v1-v6-v4-v5-v9-v8-v7,7.3.2 广度优先搜索遍历图,可见,图的广度优先搜索过程类似于树的层次遍历。和深度优
22、先搜索类似,在遍历的过程中也需要借助于访问标志数组visited。并且为了实现按照顶点被访问的先后次序查询它们的邻接点,需附设一个队列依访问次序存储已被访问的顶点。对以邻接矩阵表示方法存储的图进行广度优先遍历的算法如7.5所示。,7.3.2 广度优先搜索遍历图,算法7.5void BFSTraverse(MGraph G)bool visitedG.vexnum;/附设访问标志数组 SqQueue Q;/附设循环队列Q for(v=0;vG.vexnum;+v)visitedv=FALSE;InitQueve(Q,G.vexnum);for(v=0;vG.vexnum;+v)if(!visit
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 中的

链接地址:https://www.desk33.com/p-229804.html