数据结构与算法6_第1页
数据结构与算法6_第2页
数据结构与算法6_第3页
数据结构与算法6_第4页
数据结构与算法6_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

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

文档简介

第6章图(4课时)图也是一种非常重要的非线性数据结构,它比树结构更为复杂。在树结构中,各数据元素之前有着明显的层次关系,上一层中的一个前继结点对应下一层中的d(d≥0)个后继结点,但下一层中的一个后继结点最多只与上一层中的一个前继结点相关,因此,树型结构主要是用来表示数据元素之间一对多的关系。而在图结构中,结点之间的关系可以是任意的,图中任意两个结点都可能相关,图结构可以用来表示数据元素之间多对多的关系。6.1

图的基本概念及特性6.1.1图的基本概念6.1.2用图来描述实际问题6.1图的基本概念及特性6.1.1图的基本概念图G由顶点(图中通常将结点称为顶点)的非空有限集合V和边的集合E组成,记为G=(V,E)。每一个顶点偶对就是图中的一条边,所以,E用于表示V上的连接关系。在一个图中,至少要包含一个顶点,但可以没有任何边。通常用V(G)和E(G)来表示图G的顶点集合和边集合。下面给出图的基本术语。1.有向图和无向图若E(G)中的顶点偶对是有序的,则这些有序偶对就形成了有向边,此时图G称为有向图。其中,有向边也简称为弧。在有向图G中,对于一条从顶点vi到顶点vj的弧,记作<vi,vj>并有<vi,vj>∈E(G),称vi为弧尾,vj为弧头。例如,图6-1(a)中所示的G1是一个有向图,其顶点集合V(G1)={v0,v1,v2,v3,v4},边集合E(G1)={<v0,v1>,<v0,v2>,<v1,v4>,<v2,v0>,<v3,v0>,<v3,v2>}。6.1图的基本概念及特性6.1.1图的基本概念2.顶点的度、入度和出度在无向图G中,若存在(vi,vj)∈E(G),则称顶点vi和顶点vj互为邻接点,即顶点vi和顶点vj相邻接,或者说顶点vi、vj与边(vi,vj)相关联。与顶点vi相关联的边的数目称为顶点vi的度,记作D(vi)。例如,图6-1(b)所示的无向图G2中,各顶点的度分别为:D(v0)=3,D(v1)=D(v2)=D(v3)=2,D(v4)=1。在有向图G中,若存在<vi,vj>∈E(G),则称顶点vi邻接到顶点vj,或顶点vj邻接自顶点vi。以顶点vi为弧头的弧的数目称为顶点vi的入度,记作ID(vi);以顶点vi为弧尾的弧的数目称为vi的出度,记作OD(vi);顶点vi的入度和出度之和称为vi的度,记作D(vi)。6.1图的基本概念及特性6.1.1图的基本概念3.路径、路径长度和回路

在图G中,若存在一个顶点序列(,,…,),使得对于任意0≤j<n-1有(若G为有向图)或(若G为无向图),则该序列是从顶点到顶点的一条路径。显然,从一个顶点到另一个顶点的路径不一定唯一。一条路径中边的数目称为路径长度。在一条路径中,若一个顶点至多只经过一次,则该路径称为简单路径;若组成路径的顶点序列中第一个顶点与最后一个顶点相同,则该路径称为回路(或环);在一个回路中,若除第一个顶点与最后一个顶点外,其他顶点只出现一次,则该回路称为简单回路(或简单环)。6.1图的基本概念及特性6.1.1图的基本概念4.连通图对无向图,若至少存在一条从顶点vi到顶点vj的路径,则称顶点vi和顶点vj是连通的。若无向图G中任意两个顶点都是连通的,则称G为连通图。

对有向图,若存在从顶点vi到顶点vj的路径或存在从顶点vj到顶点vi的路径,则称顶点vi和顶点vj是单向连通的;若两条路径同时存在则称顶点vi和顶点vj是强连通的。有向图G中,若任意两个顶点都是单向连通的,则称G是单向连通图;若任意两个顶点都是强连通的,则称G为强连通图。6.1图的基本概念及特性6.1.1图的基本概念5.子图、连通分量和强连通分量

对于图G、G',若满足且,则G'是G的子图。也就是说,从图G的顶点集合中选出一个子集并从边集合中选出与该顶点子集相关的一些边所构成的图,就是图G的子图。

一个无向图的极大连通子图称为该无向图的连通分量;一个有向图的极大强连通子图称为该有向图的强连通分量。这里的“极大”是指向连通子图或强连通子图中再添加一个顶点,该子图就不再连通或强连通。显然,若一个图本身就是连通图或强连通图,那么它的连通分量或强连通分量就是图本身,具有唯一性。若一个图本身是非连通图或非强连通图,那么它的连通分量可能有多种形式。

6.1图的基本概念及特性6.1.1图的基本概念

例如,图6-2(a)和图6-2(c)分别是非连通图和非强连通图,对应的两种形式的连通分量和强连通分量分别如图6-2(b)和图6-2(d)所示。

6.1图的基本概念及特性6.1.1图的基本概念6.权和带权图

与前一章学习的树中结点的权相似,可以为一个图中的每条边标上一个具有某种意义的实数,该实数就称为是边的权。通常用边的权表示从一个顶点到另一个顶点的代价。边上带权的图就称为带权图。

6.1图的基本概念及特性6.1.1图的基本概念7.生成树和最小生成树

若无向图G的一个子图G'是一棵包含图G所有顶点的树,则G'称为图G的生成树。生成树本身是一棵树,具备树的所有性质。对于树中的任一结点,根结点都是其祖先,因此树中的任意两个结点都是连通的,即子图G'是连通图。另一方面,子图G'与图G具有相同的顶点集合,而子图G'的边集合是图G边集合的子集,因此图G必然也是连通图。也就是说,只有连通图才有生成树。

连通图的生成树不具有唯一性,从不同的顶点出发或采用不同的遍历算法,可以得到不同的生成树。6.1图的基本概念及特性6.1.1图的基本概念例如,图6-3(b)所示的就是根据图6-3(a)得到的两种不同形式的生成树。在所有形式的生成树中,边上的权之和最小的生成树,称为最小生成树。

6.1图的基本概念及特性6.1.1图的基本概念下面通过两个实例介绍如何用图来描述实际问题。【例6-1】有若干个城市,通过在两个城市之间修建高速公路使得从任一城市出发经过高速公路都可以到达另一城市。为了使修建高速公路的工程总造价最低,应如何设计?

该问题的图描述如下:将所有城市作为图的顶点,任意两个顶点相连接形成边,两个城市之间修建高速公路的工程造价作为边的权。显然,边没有方向,因此对于该问题应使用无向图表示。

如图6-4(a)所示是该问题的一个图描述示例,这里考虑4个城市,任意两个城市之间修建高速公路的工程造价作为边的权在边上标注。从而,该问题就转化为了从图G中计算子图G'的问题,目标子图G'具有如下特点:6.1图的基本概念及特性6.1.2用图来描述实际问题是一个连通图且包含图G中的所有顶点(从任一城市出发可以到达另一城市);在所有满足上一条件的子图中,目标子图G'的权之和最小(工程总造价最低)。根据上述两条特点,可知目标子图G'应是一棵树(删除任一条边都会导致子图不连通,添加任一条边都会使最终的权之和增加),并且应该是具有最小权之和的最小生成树。关于最小生成树的计算方法在6.4.1节中给出。6.1图的基本概念及特性6.1.2用图来描述实际问题【例6-2】一个人开车从一个地方去另一个地方,有多种路线,为了使总里程数最少,应走哪条路线?该问题的图描述如下:将所有路口作为图的顶点,路口之间的道路作为连接两个顶点的边,道路长度作为边的权。考虑有些道路是单行路,且往返行驶里程数可能会有所不同,因此,对于该问题应使用有向图表示。如图6-4(b)所示是该问题的一个图描述示例,这里考虑5个路口,从一个路口到另一个路口的行驶里程数作为边的权在边上标注。从而,该问题就转化为了计算图中两个顶点间最短路径的问题。关于最短路径的计算方法在6.4.2节中给出。6.1图的基本概念及特性6.1.2用图来描述实际问题6.2图的抽象数据类型和表示方式图一般需要进行下面的基本操作:创建图对图作深度优先遍历对图作广度优先遍历获取顶点数目获取边的数目获取与指定顶点相关联的第一条边获取与指定边有相同关联顶点的下一条边添加一个顶点添加一条边获取一个顶点中存储的数据判断一条边是否存在设置一条边的权获取一条边的权6.2图的抽象数据类型和表示方式在计算机中存储图,主要是要确定顶点的存储方式及顶点之间关系(即边)的存储方式。与前面学习的线性表和树相比,图存储的难点在于顶点之间的关系更为复杂(图中任意两个顶点都可以通过连接形成边)。因此,如何存储图中的边以方便地对边进行增、删、改、查等操作是图存储要解决的首要问题。根据边的存储方式的不同,图的存储结构有多种表示方法,读者可以根据实际应用需要选取合适的表示方法。下面主要介绍邻接矩阵、邻接压缩表和邻接链表这三种常用表示方法并给出每种表示方法的具体实现。6.2图的抽象数据类型和表示方式6.2.1邻接矩阵6.2.3邻接链表6.2.2邻接压缩表6.2图的抽象数据类型和表示方式邻接矩阵法是用矩阵来表示各顶点之间的连接关系。对于有n个顶点的图G=(V,E),其邻接矩阵A为n*n的方阵,元素A[i][j](0≤i,j<n)定义为:其中,wij为边(vi,vj)或<vi,vj>上的权。例如,图6-5(a)中所示的有向图G1和图6-5(c)中所示的无向图G2的邻接矩阵分别如图6-5(b)和图6-5(d)所示。6.2.1邻接矩阵6.2图的抽象数据类型和表示方式6.2.1邻接矩阵6.2图的抽象数据类型和表示方式邻接压缩表可以看作是邻接矩阵的一种压缩表示形式。当图中边的数目远远小于结点数目的平方时,邻接压缩表占据的存储空间会远远小于邻接矩阵占据的存储空间;但其缺点是边的添加、删除等操作较为复杂。邻接压缩表使用三个顺序表来表示图中顶点之间的连接关系和权,下面给出具体存储形式。设图中共有n个顶点{v0,v1,…,vn-1},三个顺序表分别为s、w和h。在s中依次记录与顶点vi(i=0,1,…,n-1)相关联的顶点,如图6-6(a)所示,可知:对无向图G,s中的元素数目两倍于图中边的数目,且有(j=0,1,…,ji-1);对有向图G,s中的元素数目等于图中边的数目,且有(j=0,1,…,ji-1)。在w中依次记录s中存储的各条边的权,其元素数目等于s中的元素数目,如图6-6(b)所示。在h中依次记录与顶点vi相关联的顶点在s中的起始存储位置,如图6-6(c)所示,h中的元素数目等于图中顶点的数目。6.2.2邻接压缩表6.2.2邻接压缩表6.2图的抽象数据类型和表示方式6.2.2邻接压缩表6.2图的抽象数据类型和表示方式邻接链表可以看作是图的一种链式存储结构。在邻接链表中,每个顶点中设置一个指向链表头的指针,在链表中保存与该顶点相邻接的顶点信息(包括顶点位置及两个顶点形成的边的权)。例如,图6-5(a)中所示的有向图G1和图6-5(c)中所示的无向图G2的邻接链表分别如图6-8(a)和图6-8(b)所示。6.2.3邻接链表6.2图的抽象数据类型和表示方式6.3图的遍历图的遍历,是指从某一顶点出发按照某种规则依次访问图中的所有顶点,且每个顶点只被访问一次。与树相比,图中顶点之间的关系更为复杂,因此图的遍历也要比树的遍历更复杂。根据搜索路径的不同,图的遍历通常采有两种方法:广度优先遍历和深度优先遍历。下面分别介绍这两种遍历方法并给出它们的具体实现。6.3图的遍历6.3.1广度优先遍历及其实现6.3.2深度优先遍历及其实现6.3图的遍历广度优先遍历类似于树的逐层遍历,即先从某一个顶点开始访问,然后访问与该顶点相邻接且未被访问过的顶点集V1(G),再访问与V1(G)中顶点相邻接且未被访问过的顶点集V2(G),重复该过程直至与初始顶点连通的所有顶点都被访问完。对于非连通图或非强连通图,还要从某一个未被访问的顶点开始重复上一过程,直至所有顶点访问完毕。例如,对于图6-5(a)所示按例6-1创建的有向图,从顶点v0开始按照广度优先遍历依次访问到的顶点为:v0、v1、v2、v4、v3;对于图6-5(c)所示按例6-1创建的无向图,从顶点v0开始按照广度优先遍历依次访问到的顶点为:v0、v1、v2、v3、v4。6.3.1广度优先遍历及其实现深度优先遍历类似于树的先序遍历,即从某一个顶点开始访问,访问后将该顶点去除得到若干子图,对每个子图再依次进行深度优先遍历。例如,对于图6-5(a)所示按例6-1创建的有向图,从顶点v0开始按照深度优先遍历依次访问到的顶点为:v0、v1、v4、v2、v3;对于图6-5(c)所示按例6-1创建的无向图,从顶点v0开始按照深度优先遍历依次访问到的顶点为:v0、v1、v4、v2、v3。对于图的深度优先遍历,与树的先序遍历一样,有递归和非递归两种实现方式,其中非递归方式需要利用栈。6.3.2深度优先遍历及其实现6.3图的遍历6.4应用实例这里给出最小生成树的求解算法和具体实现方法。6.4.1最小生成树6.4.2最短路径6.4应用实例1.Prim算法

对于有n个顶点的图G=(V,E),Prim算法从空树T开始,按照以下规则将n个顶点和n-1条边依次添加到树中,形成最小生成树:从某一顶点v0'开始,将该顶点作为树的根结点加入到T中,使得T中的数据元素集合D={v0'},数据元素关系集合R={}。对于一个顶点在集合D中、另一个顶点在集合V-D中的那些边,找出权最小的一条边,将该边在集合V-D中的顶点vi'(i=1,2,…,n-1)加入到集合D中,并将顶点间关系<vj',vi'>(j<i)加入到关系集合R中。重复上一步骤直至集合D中包括图G中所有n个顶点(此时关系集合R中包括n-1条边)。若在某一步骤中找不到边,则说明图G是一个非连通图或非强连通图,在这种情况下不存在最小生成树。6.4应用实例6.4.1最小生成树6.4应用实例6.4.1最小生成树2.Kruskal算法对于有n个顶点的图G=(V,E),Kruskal算法根据图G中所有n个顶点生成一个包括n棵只有根结点的树Ti(i=0,1,…,n-1)的森林F,并按照以下规则森林F中的树合并,形成最小生成树:从边集合E中选取未被访问过且具有最小权的边,置该边状态为已访问。判断该边的两个顶点是否属于不同的树,若属于不同的树则使用该边将两棵树合并为一棵;若属于同一棵树则不做任何处理。重复上一步骤直至森林F中只剩下一棵树,该树即是图G的最小生成树。若最后森林F中剩下不止一棵树,则说明图G是非连通图或非强连通图,在这种情况下不存在最小生成树。6.4应用实例6.4.1最小生成树6.4应用实例6.4.1最小生成树1.从某个顶点到其余各顶点的最短路径

图中两个顶点间的最短路径计算问题,与从某个顶点到其余各顶点的最短路径计算问题采用同样的算法。只是前者在得到两个顶点间的最短路径后,不需再进行后继计算。Dijkstra提出了一种按路径长度递增次序生成最短路径的算法。对于有n个顶点的图G=(V,E),若要计算从顶点v0'到其余各顶点vi'(i=1,2,…,n-1)的最短路径,则其计算步骤为:6.4.2最短路径6.4应用实例令集合S为已计算出最短路径的顶点集合(初始时S={v0'}),w(vj',vi')表示从顶点vj'到顶点vi'的边的权(这里为方便计算,令w(vi',vi')=0),D(v0',vi')表示当前计算得到的从顶点v0'到顶点vi'的最短路径长度(初始D(v0',vi')=w(v0',vi'))。将顶点加入到集合S中,并将从顶点v0‘到顶点vm’的最短路径记录下来。若仍有顶点没有加到集合S中,则对集合V-S中的顶点vi‘计算。重复上一步骤直至图中所有顶点都加到集合S中。6.4.2最短路径6.4应用实例例如,对于图6-4(b)中所示的有向图,若计算从顶点v0到其余各顶点的最短路径,则其计算过程如图6-11所示。Dijkstra算法的原理可理解为:从某一顶点v0'到另一顶点vi'的最短路径或者是(v0',vi')、或者是(v0',vi1',vi2',…,vij',vi'),若为后者则其中(v0',vi1',vi2',…,vij',vj')必然为从顶点v0'到顶点vj'的最短路径。因此,根据已计算出的那些顶点的最短路径,可以依次得到其他顶点的最短路径。6.4.2最短路径6.4应用实例6.4.2最短路径6.4应用实例2.每一对顶点之间的最短路径若要计算图中每一对顶点之间的最短路径,可以重复使用Dijkstra算法依次计算

温馨提示

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

评论

0/150

提交评论