图的定义与基本术语ppt课件_第1页
图的定义与基本术语ppt课件_第2页
图的定义与基本术语ppt课件_第3页
图的定义与基本术语ppt课件_第4页
图的定义与基本术语ppt课件_第5页
已阅读5页,还剩110页未读 继续免费阅读

下载本文档

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

文档简介

.,1,第7章图,7.1图的定义与基本术语7.2图的存储结构7.3图的遍历7.4图的连通性问题7.5有向无环图的应用7.6最短路径,.,2,图结构与表结构和树结构的不同表现在结点之间的关系上,线性表中结点之间的关系是一对一的;树是按分层关系组织的结构,树结构之间是一对多;对于图结构,图中顶点之间的关系可以是多对多,即一顶点和其它顶点间的关系是任意的,可以有关也可以无关。因此,图G树TL,图是一种比较复杂的非线性数据结构。,图作为一种非线性结构,被广泛应用于多个技术领域。在本章中,主要是应用图论的理论知识来讨论如何在计算机上表示和处理图,以及如何利用图来解决一些实际问题。,.,3,7.1图的定义与基本术语,7.1.1图的定义图(Graph)是一种网状数据结构,其形式化定义如下:,Graph=(V,R)V=xxDataObjectR=VRVR=P(x,y)(x,yV),.,4,DataObject为一个集合,该集合中的所有元素具有相同的特性。V中的数据元素通常称为顶点(vertex),VR是两个顶点之间的关系的集合。P(x,y)表示x和y之间有特定的关联属性P。,弧:若VR,则表示从顶点x到顶点y的一条弧(arc),并称x为弧尾(tail)或起始点,称y为弧头(head)或终端点。,有向图:若图中的边是有方向的,称这样的图为有向图。,.,5,无向图:若VR,必有VR,即VR是对称关系,这时以无序对(x,y)来代替两个有序对,表示x和y之间的一条边(edge),此时的图称为无向图。,例如:下图G1是有向图,G2是无向图,.,6,在图中,我们可以将任一顶点看成是图的第一个顶点,同理,对于任一顶点而言,它的邻接点之间也不存在顺序关系。为了操作的方便,我们需要将图中的顶点按任意序列排列起来。顶点在这个人为的随意排列中的位置序号称为顶点在图中的位置。,图的基本操作和其它数据结构一样,也有创建、插入、删除、查找等。,.,7,图的抽象类型定义:ADTGraph数据对象V:一个集合,该集合中的所有元素具有相同的特性。数据关系R:R=VRVR=P(x,y)(x,yV),.,8,基本操作:(1)GreateGraph(G):创建图G。(2)DestoryGraph(G):销毁图G。(3)LocateVertex(G,v):确定顶点v在图G中的位置。若图G中没有顶点v,则函数值为“空”。(4)GetVertex(G,I):取出图G中的第i个顶点的值。若i图G中顶点数,则函数值为“空”。,.,9,(5)FirstAdjVertex(G,v):求图G中顶点v的第一个邻接点。若v无邻接点或图G中无顶点v,则函数值为“空”。(6)NextAdjVertex(G,v,w):已知w是图G中顶点v的某个邻接点,求顶点v的下一个邻接点(紧跟在w后面)。若w是v的最后一个邻接点,则函数值为“空”。(7)InsertVertex(G,u):在图G中增加一个顶点u。,.,10,(8)DeleteVertex(G,v):删除图G的顶点v及与顶点v相关联的弧。(9)InsertArc(G,v,w):在图G中增加一条从顶点v到顶点w的弧。(10)DeleteArc(G,v,w):删除图G中从顶点v到顶点w的弧。(11)TraverseGraph(G):按照某种次序,对图G的每个结点访问一次且最多一次。,.,11,7.1.2基本术语,设用n表示图中顶点的个数,用e表示图中边或弧的数目,并且不考虑图中每个顶点到其自身的边或弧。,无向完全图:有n(n-1)/2条边(图中每个顶点和其余n-1个顶点都有边相连)的无向图为无向完全图。,有向完全图:有n(n-1)条边(图中每个顶点和其余n-1个顶点都有弧相连)的有向图为有向完全图。,.,12,稀疏图:对于有很少条边的图(evexsk=v)j=k;break;return(j);,.,32,intCreateDN(AdjMatrix*G)/*创建一个有向网*/inti,j,k,weight;VertexDatav1,v2;scanf(%d,%d,k+),.,33,scanf(%c,%c,%d,分析:该算法的时间复杂度为O(n2+en),其中O(n2)时间耗费在对二维数组arcs的每个分量的arj域初始化赋值上。O(en)的时间耗费在有向网中边权的赋值上。,.,34,邻接表表示法,邻接表(AdjacencyList)表示法实际上是图的一种链式存储结构。它的基本思想是只存有关联的信息,对于图中存在的边信息则存储,而对于不相邻接的顶点则不保留信息。在邻接表中,对图中的每个顶点建立一个带头结点的边链表,每个边链表的头结点又构成一个表头结点表。,这样,一个n个顶点的图的邻接表表示由表头结点表与边表两部分构成。,.,35,(1)表头结点表:由所有表头结点以顺序结构(向量)的形式存储,以便可以随机访问任一顶点的单链表。表头结点有两部分构成,其中数据域(vexdata)用于存储顶点的名或其它有关信息;链域(firstarc)用于指向链表中第一个顶点(即与顶点vi邻接的第一个邻接点)。,表头结点结构为:,.,36,(2)边表:由表示图中顶点间邻接关系的n个边链表组成。它由三部分组成,其中邻接点域(adjvex)用于存放与顶点vi相邻接的顶点在图中的位置;链域(nextarc)用于指向与顶点vi相关联的下一条边或弧的结点;数据域(info)用于存放与边或弧相关的信息(如赋权图中每条边或弧的权值等)。,弧结点结构为:,.,37,.,38,邻接表存储结构的形式化说明如下:,#defineMAX_VERTEX_NUM10/*最多顶点个数*/typedefenumDG,DN,UDG,UDNGraphKind;/*图的种类*/typedefstructArcNodeintadjvex;/*该弧指向顶点的位置*/structArcNode*nextarc;/*指向下一条弧的指针*/OtherInfoinfo;/*与该弧相关的信息*/ArcNode;,.,39,typedefstructVertexNodeVertexDatadata;/*顶点数据*/ArcNode*firstarc;/*指向该顶点第一条弧的指针*/VertexNode;typedefstructVertexNodevertexMAX_VERTEX_NUM;intvexnum,arcnum;/*图的顶点数和弧数*/GraphKindkind;/*图的种类标志*/AdjList;/*基于邻接表的图(AdjacencyListGraph)*/,.,40,存储空间:对于有n个顶点,e条边的无向图而言,若采取邻接表作为存储结构,则需要n个表头结点和2e个表结点。,无向图的度:在无向图的邻接表中,顶点vi的度恰好就是第i个边链表上结点的个数。,有向图的度:在有向图中,第i个边链表上顶点的个数是顶点vi的出度。要想求得该顶点的入度,则必须遍历整个邻接表。在所有单链表中查找邻接点域的值为i的结点并计数求和。,.,41,由此可见,对于用邻接表方式存储的有向图,求顶点的入度并不方便,因此需要有一种解决的方法逆邻接表法。,对图中的每一顶点vi建立一个递邻接表,即对每个顶点vi建立一个所有以顶点vi为弧头的弧的表,这样求顶点vi的入度即是计算逆邻接表中第i个顶点的边链表中结点个数。,.,42,十字链表,十字链表(OrthogonalList)是有向图的另一种链式存储结构。我们也可以把它看成是将有向图的邻接表和逆邻接表结合起来形成的一种链表。,有向图中的每一条弧对应十字链表中的一个弧结点,同时有向图中的每个顶点在十字链表中对应有一个结点,叫做顶点结点。,.,43,data,firstin,firstout,info,tailvex,headvex,边结点表中的结点的表示:,结点表中的结点的表示:,data:结点的数据场,保存结点的数据值。firstin:结点的指针场,给出自该结点出发的的第一条边的边结点的地址。firstout:结点的指针场,给出进入该结点的第一条边的边结点的地址。,info:边结点的数据场,保存边的权值等。,hlink,tlink,tailvex:本条边的出发结点的地址。headvex:本条边的终止结点的地址。,hlink:出发结点相同的边中的下一条边的地址。tlink:终止结点相同的边中的下一条边的地址。,.,44,实例:,A,B,C,D,向图G1,0123,A,B,C,D,0,1,0,2,2,2,2,0,0,3,3,3,3,1,data,firstin,firstout,tailvex,headvex,hlink,tlink,用途:用于有向图,查询进入结点和离开结点的边容易。,.,45,建立一个有向图的十字链表的算法如下:,voidCrtOrthList(OrthListg)/*从终端输入n个顶点的信息和e条弧的信息,以建立一个有向图的十字链表*/scanf(“%d,%d”,i+)scanf(“%c”,g.vertexi.data);g.vertexi.firstin=NULL;g.vertexi.firsout=NULL;,.,46,for(k=0;ktailvex=i;p-headvex=j;p-tlink=g.vertexi.firstout;g.vertexi.firstout=p;p-hlink=g.vertexj.firstin;g.vertexj.firstin=p;/*CrtOrthList*/,.,47,十字链表的优点:,在十字链表中既能够很容易地找到以vi为尾的弧,也能够容易地找到以vi为头的弧,因此对于有向图,若采用十字链表作为存储结构,则很容易求出顶点vi的度。,.,48,邻接多重表,邻接多重表(AdjacencyMulti_list)是无向图的另外一种存储结构。使用邻接多重表这种存储结构是因为它能够提供更为方便的边处理信息。,邻接多重表是指将图中关于一条边的信息用一个结点来表示。,.,49,data,firstedge,mark,ivex,ilink,边结点表中的结点的表示:,结点表中的结点的表示:,data:结点的数据场,保存结点的数据值。firstedge:结点的指针场,给出自该结点出发的的第一条边的边结点的地址。,info:边结点的数据场,保存边的权值等。mark:边结点的标志域,用于标识该条边是否被访问过。,jvex,info,ivex:本条边依附的一个结点的地址。ilink:依附于该结点(地址由ivex给出)的边中的下一条边的的地址。,jlink,jvex:本条边依附的另一个结点的地址。jlink:依附于该结点(地址由jvex给出)的边中的下一条边的的地址。,.,50,实例:,无向图G2,用途:用于无向图,边表中的边结点只需存放一次,节约内存。,A,B,C,D,E,A,B,12345,datafirstedge,C,D,E,1,2,3,5,5,2,4,2,1,3,4,5,mark,ivex,ilink,jvex,jlink,.,51,邻接多重表的结构类型说明如下:,typedefstructEdgeNodeintmark,ivex,jvex;structEdgeNode*ilink,*jlink;EdgeNode;typedefstructVertexDatadata;EdgeNode*firstedge;VertexNode;,.,52,typedefstructVertexNodevertexMAX_VERTEX_NUM;intvexnum,arcnum;/*图的顶点数和弧数*/GraphKindkind;/*图的种类*/AdjMultiList;/*基于图的邻接多重表表示法(AdjacencyMulti_list)*/,图G2的邻接多重表见p167的图7.12所示。,.,53,7.4图的遍历,图的遍历:从图中的某个顶点出发,按某种方法对图中的所有顶点访问且仅访问一次。,为了保证图中的各顶点在遍历过程中访问且仅访问一次,需要为每个顶点设一个访问标志,用以标示图中每个顶点是否被访问过,访问标志用数组visitedn来表示。,图的遍历方法有两种:深度优先搜索和广度优先搜索,.,54,深度优先搜索:,注意:每个结点只能被访问一次,又因为一个结点可以和其它的任何结点相邻接,为了避免对一个结点的重复访问,必须对访问过的结点加以标记。结点的邻接结点的次序是任意的,因此深度优先搜索的序列可能有多种。深度优先搜索类似于树的前序周游。访问方式:1、选中第一个被访问的结点。2、对结点作已访问过的标志。3、依次从结点的未被访问过的第一个、第二个、第三个相邻结点出发,进行深度优先搜索。转向2。4、如果还有顶点未被访问,则选中一个起始结点,转向2。5、所有的结点都被访问到,则结束。,.,55,深度优先搜索的过程示例见p168的7.13图所示。其中实箭头代表访问方向,虚箭头代表回溯方向,箭头旁边的数字代表搜索顺序,A为起始顶点。,访问序列为:A、B、C、F、E、G、D、H、I。,.,56,图的深度优先搜索的算法描述如下:,#defineTrue1#defineFalse0#defineError1/*出错*/#defineOk1intvisitedMAX_VERTEX_NUM;/*访问标志数组*/,.,57,voidTraverseGraph(Graphg)/*对图g进行深度优先搜索,Graph表示图的一种存储结构,如数组表示法或邻接表等*/for(vi=0;vig.vexnum;vi+)visitedvi=False;/*访问标志数组初始*/for(vi=0;viadjvex);p=p-nextarc;/*DepthFirstSearch*/,.,62,分析算法:以邻接表作为存储结构,查找每个顶点的邻接点的时间复杂度为O(e),其中e是无向图中的边数或有向图中弧数,则深度优先搜索图的时间复杂度为O(n+e)。,.,63,7.3.2广度优先搜索,广度优先搜索(Breadth_FirstSearch)是指按照广度方向搜索,它类似于树的按层次遍历。,注意:每个结点只能被访问一次,又因为一个结点可以和其它的任何结点相邻接,为了避免对一个结点的重复访问,必须对访问过的结点加以标记。结点的邻接结点的次序是任意的,因此广度优先搜索的序列可能有多种。广度优先搜索类似于树的从根出发的按层次遍历。访问方式:1、选中第一个被访问的结点V2、对结点V作已访问过的标志。3、依次从结点V的未被访问过的第一个、第二个、第三个第M个邻接结点W1、W2、W3Wm,且进行标记。4、依次访问结点W1、W2、W3Wm的邻接结点,且进行标记。5、如果还有结点未被访问,则选中一个起始结点,也标记为V,转向2。6、所有的结点都被访问到,则结束。,.,64,广度优先搜索过程示例见p169的图7.16所示。其中箭头代表搜索方向,箭头旁边的数字代表搜索顺序,A为起始顶点。,访问序列为:A、B、E、D、C、G、F、H、I。,.,65,广度优先搜索连通子图的算法如下:,voidBreadthFirstSearch(Graphg,intv0)/*广度优先搜索图g中v0所在的连通子图*/visit(v0);visitedv0=True;InitQueue(/*求v的第一个邻接点*/,.,66,while(w!=-1)if(!visited(w)visit(w);visitedw=True;EnterQueue(/*求v相对于w的下一个邻接点*/,.,67,.,68,7.4图的连通性问题,无向图的连通分量,在对图遍历时,对于连通图,无论是广度优先搜索还是深度优先搜索,仅需要调用一次搜索过程,即从任一个顶点出发,便可以遍历图中的各个顶点。对于非连通图,则需要多次调用搜索过程,而每次调用得到的顶点访问序列恰为各连通分量中的顶点集。调用搜索过程的次数就是该图连通分量的个数。,.,69,连通:顶点v至v之间有路径存在连通图:无向图图G的任意两点之间都是连通的,则称G是连通图。连通分量:极大连通子图,.,70,例如:上图G是一个非连通图,按照它的邻接表进行深度优先搜索遍历,三次调用深度优先搜索(DepthFirstSearch)过程得到的访问顶点序列为:ABDCMEHFGIJLK因此有三个连通分量。,.,71,求图的连同分量

温馨提示

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

评论

0/150

提交评论