《图及其应用》PPT课件.ppt_第1页
《图及其应用》PPT课件.ppt_第2页
《图及其应用》PPT课件.ppt_第3页
《图及其应用》PPT课件.ppt_第4页
《图及其应用》PPT课件.ppt_第5页
已阅读5页,还剩113页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1,第七章图,2,7.1抽象数据类型图的定义,7.2图的存储表示,7.3图的遍历,7.4最小生成树,7.6最短路径问题,7.5拓扑排序,、关键路径,3,熟悉图的各种存储结构及其构造算法,了解实际问题的求解效率与采用何种存储结构和算法有密切联系。2.熟练掌握图的两种搜索路径的遍历:深度优先搜索和广度优先搜索的算法。3.图的算法应用。,学习提要,4,图(Graph):图G是由两个集合V(G)和E(G)组成的,记为G=(V,E)。其中:V(G)是顶点的非空有限集,E(G)是边的有限集合,边是顶点的无序对或有序对。有向图:有向图G是由两个集合V(G)和E(G)组成。其中:V(G)是顶点的非空有限集E(G)是有向边(也称弧)的有限集合,弧是顶点的有序对,记为,v,w是顶点,v为弧尾,w为弧头。无向图:无向图G是由两个集合V(G)和E(G)组成的。其中:V(G)是顶点的非空有限集,E(G)是边的有限集合,边是顶点的无序对,记为(v,w)或(w,v),并且(v,w)=(w,v),图的定义和术语,5,图G1中:V(G1)=1,2,3,4,5,6E(G1)=,图G2中:V(G2)=1,2,3,4,5,6,7E(G1)=(1,2),(1,3),(2,3),(2,4),(2,5),(5,6),(5,7),6,有向完备图:n个顶点的有向图最大边数是n(n-1)。无向完备图:n个顶点的无向图最大边数是n(n-1)/2。,7,权:与图的边或弧相关的数。网:带权的图,8,子图:如果图G(V,E)和图G(V,E),满足:VV,EE,则称G为G的子图。,9,顶点的度无向图中,顶点的度为与每个顶点相连的边数。有向图中,顶点的度分成入度与出度。入度:以该顶点为头的弧的数目。出度:以该顶点为尾的弧的数目。,10,路径:路径是顶点的序列V=Vi,0,Vi,1,Vi,n,满足(Vi,j-1,Vi,j)E或E,(1jn)。路径长度:沿路径边的数目或沿路径各边权值之和。回路:第一个顶点和最后一个顶点相同的路径。简单路径:序列中顶点不重复出现的路径叫简单回路:除了第一个顶点和最后一个顶点外,其余顶点不重复出现的回路。,路径:1,2,3,5,6,3路径长度:5简单路径:1,2,3,5回路:1,2,3,5,6,3,1简单回路:3,5,6,3,11,路径:1,2,5,7,6,5,2,3路径长度:7简单路径:1,2,5,7,6回路:1,2,5,7,6,5,2,1简单回路:1,2,3,1,12,连通:从顶点V到顶点W有路径,则说V和W是连通的。连通图:图中任意两个顶点都是连通的图。,13,连通分量:非连通图的每一个连通部分。强连通图:有向图中,如果对每一对Vi,VjV,ViVj,从Vi到Vj和从Vj到Vi都存在路径,则称G是强连通图。,14,7.2图的存储表示,一、图的数组(邻接矩阵)存储表示,二、图的邻接表存储表示,三、有向图的十字链表存储表示,四、无向图的邻接多重表存储表示,15,Aij=,0(i,j)VR,1(i,j)VR,图的数组(邻接矩阵)存储表示,定义:矩阵的元素为,特点:对称矩阵,顶点的度数,FirstAdjVex(G,v);,NextAdjVex(G,v,w);,如何求?,ABCDEF,ABCDEF,16,从无向图的邻接矩阵可以得出如下结论,(1)矩阵是对称的,可压缩存储(上(下)三角);(2)第i行或第i列中1的个数为顶点i的度;(3)矩阵中1的个数的一半为图中边的数目;(4)很容易判断顶点i和顶点j之间是否有边相连(看矩阵中i行j列值是否为1)。,17,有向图的邻接矩阵,从有向图的邻接矩阵可以得出如下结论,(1)矩阵不一定是对称的;(2)第i行中1的个数为顶点i的出度;(3)第i列中1的个数为顶点i的入度;(4)矩阵中1的个数为图中弧的数目;(5)很容易判断顶点i和顶点j是否有弧相连.,ABCDE,ABCDE,18,网的邻接矩阵表示,类似地可以定义网的邻接矩阵为:wij若(i,j)E(G)或i,jE(G)其它情形,Aij=,12345,12345,19,constMAX_VERTEX_NUM=20;/最大顶点个数typedefenumDG,DN,AG,ANGraphKind;/类型标志有向图,有向网,无向图,无向网typedefstructArcCell/弧的定义VRTypeadj;/VRType是顶点关系类型。/对无权图,用1或0表示相邻否;对带权图,则为权值类型。InfoType*info;/该弧相关信息的指针AdjMatrixMAX_VERTEX_NUMMAX_VERTEX_NUM;typedefstruct/图的定义VertexTypevexsMAX_VERTEX_NUM;/顶点信息AdjMatrixarcs;/表示顶点之间关系的二维数组intvexnum,arcnum;/图的当前顶点数和弧(边)数GraphKindkind;/图的种类标志MGraph;,图的C语言描述,20,容易实现图的操作,如:求某顶点的度、判断顶点之间是否有边(弧)、找顶点的邻接点等等。n个顶点需要n*n个单元存储边(弧);空间效率为O(n2)。,邻接矩阵存储方式的优点:,邻接矩阵存储方式缺点:,21,图的邻接表存储表示,顶点的度数,FirstAdjVex(G,v);,NextAdjVex(G,v,w);,如何求?,例,1,2,3,4,a,c,d,b,data,firstarc,adjvex,next,5,e,22,有向图的邻接表,顶点的出度和入度,FirstAdjVex(G,v);,NextAdjVex(G,v,w);,如何求?,23,有向图的逆邻接表,在有向图的邻接表中,对每个顶点,链接的是指向该顶点的弧。,24,typedefstructArcNodeintadjvex;/该弧所指向的顶点的下标structArcNode*nextarc;/指向下一条弧的指针InfoType*info;/该弧相关信息的指针ArcNode;,adjvexnextarcinfo,弧的结点结构,typedefstructVNodeVertexTypedata;/顶点信息ArcNode*firstarc;/指向第一条依附该顶点的弧VNode,AdjListMAX_VERTEX_NUM;,datafirstarc,顶点的结点结构,25,typedefstructAdjListvertices;intvexnum,arcnum;intkind;/图的种类标志ALGraph;,图的结构定义,26,已知某网的邻接(出边)表,请画出该网络。,80,64,1,2,5,当邻接表的存储结构形成后,图便唯一确定!,27,讨论:邻接表与邻接矩阵有什么异同之处?,1.联系:邻接表中每个链表对应于邻接矩阵中的一行,链表中结点个数等于一行中非零元素的个数。2.区别:对于任一确定的无向图,邻接矩阵是唯一的(行列号与顶点编号一致),但邻接表不唯一(链接次序与顶点编号无关)。邻接矩阵的空间复杂度为O(n2),而邻接表的空间复杂度为O(n+e)。3.用途:邻接矩阵多用于稠密图的存储(e接近n(n-1)/2);而邻接表多用于稀疏图的存储(en2),28,有向图的十字链表表示法,29,typedefstruct/十字链表结构定义VexNodexlistMAX_VERTEX_NUM;/表头向量intvexnum,arcnum;/有向图的当前顶点数和弧数GraphKindkind;/图的种类标志OLGraph;,30,31,顶点结点:typedefstructdnodeintdata;/存与顶点有关的信息structnode*firstedge;/指向第一条依附于该顶点的边vexnode;,边结点:typedefstructnodeintmark;/访问标记域intivex,jvex;/该边依附的两个顶点在表头数组中位置structnode*ilink,*jlink;/分别指向依附于ivex和jvex的下一条边EgeNode;,无向图的邻接多重表表示法,32,typedefstruct/多重链表结构定义VexNodeadjmulistMAX_VERTEX_NUM;intvexnum,edgenum;/无向图的当前顶点数和边数GraphKindkind;/图的种类标志AMLGraph;,33,34,各种存储结构的适用类型,数组:有向图和无向图邻接表(逆邻接表):有向图和无向图十字链表:有向图邻接多重表:无向图,35,7.3图的遍历,从图中某个顶点出发游历图,访遍图中其余顶点,并且使图中的每个顶点仅被访问一次的过程。,深度优先搜索,广度优先搜索,遍历应用举例,36,1、深度优先遍历(DFS)方法:从图的某一顶点V0出发,访问此顶点;然后依次从V0的未被访问的邻接点出发,深度优先遍历图,直至图中所有和V0相通的顶点都被访问到;若此时图中尚有顶点未被访问,则另选图中一个未被访问的顶点作起点,重复上述过程,直至图中所有顶点都被访问为止。,37,38,深度遍历:V1,V3,V7,V6,V2,V5,V8,V4,39,深度优先遍历算法:递归算法,40,深度遍历:V1,V3,V7,V6,V2,V4,V8,V5,voidDFS(GraphG,intv)/从顶点v出发,深度优先搜索遍历图Gvisitedv=TRUE;VisitFunc(v);for(w=FirstAdjVex(G,v);w!=0;w=NextAdjVex(G,v,w)if(!visitedw)DFS(G,w);/对v的尚未访问的邻接顶点w/递归调用DFS/DFS,问题?,按该存储结构得到的遍历次序是否唯一?,41,voidDFSTraverse(ALGraphG)/对以邻接表表示的图G作深度优先遍历boolvisitedG.vexnum;/附设访问标识数组for(v=0;vG.vexnum;+v)visitedv=FALSE;/访问标识数组初始化for(v=0;vG.vexnum;+v)if(!visitedv)DFS(G,v);/对尚未访问的顶点调用DFS,42,广度优先搜索遍历图,方法:从图的某一顶点V0出发,访问此顶点后,依次访问V0的各个未曾访问过的邻接点;然后分别从这些邻接点出发,广度优先遍历图,直至图中所有已被访问的顶点的邻接点都被访问到;若此时图中尚有顶点未被访问,则另选图中一个未被访问的顶点作起点,重复上述过程,直至图中所有顶点都被访问为止,广度遍历:V1V2V3V4V5V6V7V8,43,广度遍历:V1V2V3V4V5V6V7V8,广度遍历:V1V2V3V4V5V6V7V8,广度遍历:V1V2V3V4V6V7V8V5,44,45,46,47,voidBFSTraverse(GraphG,Status(*Visit)(intv)for(v=0;vG.vexnum;+v)visitedv=FALSE;/初始化访问标志InitQueue(Q);/置空的辅助队列Qfor(v=0;vG.vexnum;+v)if(!visitedv)/v尚未访问visitedu=TRUE;Visit(u);/访问uEnQueue(Q,v);/v入队列/BFSTraverse,while(!QueueEmpty(Q)DeQueue(Q,u);/队头元素出队并置为ufor(w=FirstAdjVex(G,u);w!=0;w=NextAdjVex(G,u,w)if(!visitedw)visitedw=TRUE;Visit(w);EnQueue(Q,w);/访问的顶点w入队列/if/while,48,定义:所有顶点均由边连接在一起,但不存在回路的图。深度优先生成树与广度优先生成树。生成森林:非连通图每个连通分量的生成树一起组成非连通图的生成森林。说明(1)一个图可以有许多棵不同的生成树(2)所有生成树具有以下共同特点:生成树的顶点个数与图的顶点个数相同生成树是图的极小连通子图一个有n个顶点的连通图的生成树有n-1条边生成树中任意两个顶点间的路径是唯一的在生成树中再加一条边必然形成回路含n个顶点n-1条边的图不一定是生成树,生成树,49,深度遍历:V1V2V4V8V5V3V6V7,广度遍历:V1V2V3V4V5V6V7V8,深度优先生成树,广度优先生成树,50,51,问题提出:要在n个城市间建立通信联络网,顶点表示城市,权表示城市间建立通信线路所需花费代价。希望找到一棵生成树,它的每条边上的权值之和(即建立该通信网所需花费的总代价)最小。问题分析:n个城市间,最多可设置n(n-1)/2条线路n个城市间建立通信网,只需n-1条线路问题转化为:如何在可能的线路中选择n-1条,能把所有城市(顶点)均连起来,且总耗费(各边权值之和)最小。,最小生成树,52,方法一:普里姆(Prim)算法算法思想:设N=(V,E)是连通网,TE是N上最小生成树中边的集合。(1)初始令U=u0,(u0V),TE=;(2)在所有uU,vV-U的边(u,v)E中,找一条代价最小的边(u0,v0)并入集合TE,同时v0并入U;(3)重复上述操作直至U=V为止,则T=(V,TE)为N的最小生成树。算法实现:图用邻接矩阵表示算法评价:T(n)=O(n),构造最小生成树方法,53,1,从V1开始构造,即U=V1,54,structVertexTypeadjvex;/U集合中的顶点序号VRTypelowcost;/和顶点集U中顶点相连接的最小代价closedgeMAX_VERTEX_NUM;,设置一个辅助数组,对当前VU集中的每个顶点,记录和顶点集U中顶点相连接的代价最小的边:,55,a,b,c,d,e,g,f,19,5,14,18,27,16,8,21,3,a,e,12,d,c,b,7,a,a,a,19,14,18,14,例如:,e,12,e,e,8,16,8,d,3,d,d,7,21,3,c,5,5,a,b,c,d,e,f,g,a,e,b,c,d,f,g,a,e,d,b,c,f,g,a,e,d,c,b,f,g,a,e,d,c,b,f,g,abcdefg,g,f,56,constMAX_VERTEX_NUM=20;/最大顶点个数typedefenumDG,DN,AG,ANGraphKind;/类型标志有向图,有向网,无向图,无向网typedefstructArcCell/弧的定义VRTypeadj;/VRType是顶点关系类型。/对无权图,用1或0表示相邻否;对带权图,则为权值类型。InfoType*info;/该弧相关信息的指针AdjMatrixMAX_VERTEX_NUMMAX_VERTEX_NUM;typedefstruct/图的定义VertexTypevexsMAX_VERTEX_NUM;/顶点信息AdjMatrixarcs;/表示顶点之间关系的二维数组intvexnum,arcnum;/图的当前顶点数和弧(边)数GraphKindkind;/图的种类标志MGraph;,图的邻接矩阵存储表示的C语言描述,57,voidMiniSpanTree_P(MGraphG,VertexTypeu)/用普里姆算法从顶点u出发构造网G的最小生成树k=LocateVex(G,u);for(j=0;jG.vexnum;+j)/辅助数组初始化if(j!=k)closedgej=u,G.arcskj.adj;closedgek.lowcost=0;/初始,Uufor(i=1;iG.vexnum;+i)k=minimum(closedge);/求出加入生成树的下一个顶点(k)printf(closedgek.adjvex,G.vexsk);/输出生成树上一条边closedgek.lowcost=0;/第k顶点并入U集for(j=0;jG.vexnum;+j)/修改closedge数组if(G.arcskj.adjclosedgej.lowcost)closedgej=G.vexsk,G.arcskj.adj;,58,方法二:克鲁斯卡尔(Kruskal)算法算法思想:设连通网N=(V,E),令最小生成树(1)初始状态为只有n个顶点而无边的非连通图T=(V,),每个顶点自成一个连通分量;(2)在E中选取代价最小的边,若该边依附的顶点落在T中不同的连通分量上,则将此边加入到T中;否则,舍去此边,选取下一条代价最小的边;(3)依此类推,直至T中所有顶点都在同一连通分量上为止。,59,(0)用顶点数组和边数组存放顶点和边信息(1)初始时,令每个顶点的jihe互不相同;每个边的flag为0(2)选出权值最小且flag为0的边(3)若该边依附的两个顶点的jihe值不同,即非连通,则令该边的flag=1,选中该边;再令该边依附的两顶点的jihe以及两集合中所有顶点的jihe相同若该边依附的两个顶点的jihe值相同,即连通,则令该边的flag=2,即舍去该边(4)重复上述步骤,直到选出n-1条边为止,顶点结点:typedefstructintdata;/顶点信息intjihe;VEX;,边结点:typedefstructintvexh,vext;/边依附的两顶点intweight;/边的权值intflag;/标志域EDGE;,算法实现,60,1,1,1,1,1,4,2,1,1,1,2,2,2,2,2,算法描述,2,61,普里姆算法,克鲁斯卡尔算法,时间复杂度,O(n2),O(eloge),稠密图,稀疏图,算法名,适应范围,两种算法的比较,62,问题提出:学生选修课程问题顶点表示课程,有向弧表示先决条件,若课程i是课程j的先决条件,则图中有弧,学生应按怎样的顺序学习这些课程,才能无矛盾、顺利地完成学业,这就牵涉到拓扑排序。,拓扑排序,63,定义AOV网:用顶点表示活动,用弧表示活动间优先关系的有向图称为顶点表示活动的网(ActivityOnVertexnetwork),简称AOV网。若是图中有向边,则vi是vj的直接前驱;vj是vi的直接后继。AOV网中不允许有回路,否则意味着某项活动以自己为先决条件。拓扑排序:把AOV网络中各顶点按照它们相互之间的优先关系排列成一个线性序列的过程。检测AOV网中是否存在环方法:对有向图构造其顶点的拓扑有序序列,若网中所有顶点都在它的拓扑有序序列中,则该AOV网必定不存在环。,64,拓扑排序的方法(1)在有向图中选一个没有前驱的顶点且输出之;(2)从图中删除该顶点和所有以它为尾的弧;(3)重复上述两步,直至全部顶点均已输出;或者当图中不存在无前驱的顶点为止,65,拓扑序列:C1-C2-C3-C4-C5-C7-C9-C10-C11-C6-C12-C8或:C9-C10-C11-C6-C1-C12-C4-C2-C3-C5-C7-C8,注意:一个AOV网的拓扑序列不是唯一的,66,(1)先选择没有前驱的顶点C1,删除C1和所有以它为尾的弧。,67,(2)选择没有前驱的顶点C2,删除C2和所有以它为尾的弧。拓扑序列:C1-C2,(3)选择没有前驱的顶点C3,删除C3和所有以它为尾的弧。拓扑序列:C1-C2-C3,68,C4,C5,(4)选择没有前驱的顶点C4,删除C4和所有以它为尾的弧。拓扑序列:C1-C2-C3-C4,(5)选择没有前驱的顶点C5,删除C5和所有以它为尾的弧。拓扑序列:C1-C2-C3-C4C5,69,70,71,那么如何进行拓扑排序?步骤如下:(1)在AOV网中选择一个没有前驱的顶点并输出;(2)从AOV网中删除该顶点以及从它出发的弧;重复以上两步直至AOV网变空(即已输出所有顶点)或者剩余子图中不存在没有前驱的顶点。后一种情况则说明该AOV网中含有向环。,如右所示AOV网的拓扑排序的过程如动画所示。,图中存在一个有向环,则在拓扑排序输出顶点c之后就找不到没有前驱的顶点了,没有前驱的顶点入度为零的顶点,删除顶点及以它为尾的弧弧头顶点的入度减1,72,算法实现(1)以邻接表作存储结构;(2)把邻接表中所有入度为0的顶点进栈,便于查询;(3)栈非空时,输出栈顶元素Vj并退栈;在邻接表中查找Vj的直接后继Vk,把Vk的入度减1;若Vk的入度为0则进栈;(4)重复上述操作直至栈空为止。若栈空时输出的顶点个数不是n,则有向图有环;否则,拓扑排序完毕,73,算法描述,1,6,74,输出序列:6,75,输出序列:6,76,输出序列:6,77,输出序列:6,78,输出序列:6,79,输出序列:6,80,输出序列:61,81,输出序列:61,82,输出序列:61,4,83,输出序列:61,4,84,输出序列:61,4,85,输出序列:61,4,3,86,输出序列:61,4,3,87,输出序列:61,4,3,88,输出序列:61,4,3,89,输出序列:61,4,3,90,输出序列:613,4,3,91,输出序列:613,4,92,输出序列:613,4,93,输出序列:613,4,94,输出序列:613,4,2,95,输出序列:613,4,2,96,输出序列:613,4,2,97,输出序列:6132,4,2,98,输出序列:6132,4,99,输出序列:61324,4,100,输出序列:61324,101,输出序列:61324,5,102,输出序列:61324,5,103,输出序列:613245,5,104,输出序列:613245,105,CountInDegree(G,indegree);/对各顶点求入度InitStack(S);for(i=0;iG.vexnum;+i)if(!indegreei)Push(S,i);/入度为零的顶点入栈count=0;/对输出顶点计数while(!EmptyStack(S)Pop(S,v);+count;printf(v);for(w=FirstAdj(G,v);w!=0;w=NextAdj(G,v,w)-indegree(w);/弧头顶点的入度减一if(!indegreew)Push(S,w);/新产生的入度为零的顶点入栈if(countG.vexnum)printf(“图中有回路”)ElsereturnOK,106,关键路径问题提出:把工程计划表示为有向图,用顶点表示事件,弧表示活动;每个事件表示在它之前的活动已完成,在它之后的活动可以开始。例设一个工程有11项活动,9个事件。事件V1表示整个工程开始,事件V9表示整个工程结束。问题:(1)完成整项工程至少需要多少时间?(2)哪些活动是影响工程进度的关键?,107,如何求关键活动?,ve(j)=事件Vj的最早发生时间(从源点到顶点j的最长路径长度),vl(j)=事件Vj的最迟发生时间e(i)表示活动ai的最早开始时间l(i)表示活动ai的最迟开始时间关键活动关键路径上的活动叫,即l(i)=e(i)的活动,源点,汇点,108,设活动ai用弧表示,其持续时间记为:dut()则有:(1)e(i)=Ve(j)(2)l(i)=Vl(k)-dut(),如何求Ve(j)和Vl(j)?,(2)从Vl(n)=Ve(n)开始向后递推,如何找e(i)=l(i)的关键活动?,(1)从Ve(1)=0开始向前递推,109,求关键路径步骤求Ve(i)求Vl(j)求e(i)(e(i)=Ve(j)求l(i)(Vl(k)-dut()计算l(i)-e(i),V1V2V3V4V5V6V7V8V9,064577161418,0668710161418,a1a2a3a4a5a6a7a8a9a10a11,110,问题:从某顶点出发,沿图的边到达

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论