收藏 分享(赏)

数据结构07章[1].ppt

上传人:hskm5268 文档编号:7011043 上传时间:2019-04-30 格式:PPT 页数:80 大小:682KB
下载 相关 举报
数据结构07章[1].ppt_第1页
第1页 / 共80页
数据结构07章[1].ppt_第2页
第2页 / 共80页
数据结构07章[1].ppt_第3页
第3页 / 共80页
数据结构07章[1].ppt_第4页
第4页 / 共80页
数据结构07章[1].ppt_第5页
第5页 / 共80页
点击查看更多>>
资源描述

1、第七章 图 (Graphics),7.1 图的术语,1. ADT图的定义: P156,ADT Graph D_Object: V = 具有相同特性的数据元素的集 合,即:V为顶点集。 D_Relation: R = VR VR = | v, wV且P(v, w), 表示从v到w的弧,谓词 P(v, w)定义了弧的意义或信息 B_OP: (共13种) ADT Graph,2. 图:一个图G由两个集合V和R组成,用G=(V, R)表示,其中:V为有限非空顶点(Vertex)集,即:V=v|vElemSet(顶点:图中的数据元素);R是边(Edge)(或弧(Arc)的有限集,即:R = VR, VR

2、 = | P(v, w), 且v, wV。,有时,图G的顶点集记为V(G);边(或弧)的集记为E(G)(或A(G),边(或弧)的集在不明确是何种图时通常记为R(G)。,3. 有向图(Digraph) :若图G中的每一条边都用箭头指明了方向,则称G为有向图。有向图中的边称为弧(Arc),弧的集合记为A(G)或A,且G记为G = (V, A)。,在有向图G中,若vi, vjV(G), A(G), 则称是G中的从vi到vj的一条弧,且称vi为弧尾(Tail)(或初始点(Initial Node),vj为弧头(Head)(或终端点(Terminal Node);若A(G), 则vj是弧尾,vi是弧头,

3、且。,设图G中有n个顶点,则G中弧的条数最多为n(n1)条。,例:G1,V(G1)=v1, v2, v3, v4,A(G1)=, , ,4. 无向图(Undigraph):图中的边没有指明方向。即以无序对(vi, vj)代替和两个序偶表示图G中的一条边。此时可视(vi, vj)=(vj, vi)。边的集合记为E(G)或E,且G记为G = (V, E)。,注:1) 无论是有向图,还是无向图,若(vi, vj)R(G),则要求vivj,如:,就不能出现在图中,即不能认为是图中的边(或弧)。,2) 图中两个顶点之间不允许多次出现同一条边(或弧),否则就不是图,而称为多重图。,如:,不是图,3) 用n

4、表示图中顶点的数目,用e表示边(或弧)的数目,那么,对于无向图,0en(n1)/2;对于有向图,0en(n1)。,无向图例:,V(G)=v1, v2, v3, v4,E(G)=(v1, v2), (v1, v3), (v1, v4) , (v2, v3), (v2, v4) ,(v3, v4),此图中边数共6条,即:,5. 完全图,1) 有向完全图:n个顶点的有向图中若有n(n1)条弧,则称该图为有向完全图。,2) 无向完全图:n个顶点的无向图中有,条边,则称,该图为无向完全图。,6. 稀疏图和稠密图,具有n个顶点的图G中边(或弧)的条数很少(如enlogn)的图称为稀疏图(Sparse Gr

5、aph),反之称为稠密图(Dense Graph)。(边的条数究竟少于多少才称为稀疏图,并无确切的限定),7. 网(Network) 带权的图,把一组与图中的边(或弧)相关的数称作图中相应边(或弧)的权(Weight)(或权值)。带权的图称为网(Network)。,8. 子图(Subgraph):若有两个图G=(V, R)和 G=(V, R),且满足条件:,V(G)V(G),且R(G)R(G) 则称G是G的子图。,9. 关联(Relation)、邻接(Adjacent):,1) 对于无向图G = (V, E),如果边(vi, vj)E(G),则称顶点vi和vj互为邻接点(Adjacent),即

6、: vi和vj 相互邻接;称边(vi, vj)依附 (Incident) (或关联)于顶点vi和vj, 或者说边(vi, vj)与顶点vi和vj相关联。,注:邻接表示顶点之间的逻辑关系,关联表示边与顶点之间的关系。,2) 对于有向图G = (V, A),如果弧A(G),则称顶点vi邻接到顶点vj,或顶点vj邻接自顶点vi;又称弧与顶点vi和vj相关联。,10. 顶点的度(Degree), 在无向图中,与顶点vi(viV(G)相关联的边的条数称为vi的度,记为TD(vi)。, 在有向图中,顶点vi的度TD(vi) = ID(vi) + OD(vi)。即:顶点的入度、出度之和,其中:,入度(InD

7、egree):ID(vi)等于以vi为头的边的数目。,出度(OutDegre):OD(vi)等于以vi为尾的边的数目。,注:一个有n个顶点、e条边(或弧)的无向图(或有向图)的顶点的度,均满足下列关系:,(n为图G的顶点数),11. 路径(Path)和环(Cycle)(回路),a) 若G是无向图,如果(vp, vi1), (vi1, vi2), (vin, vq)E(G),则顶点序列(vp, vi1, vi2, ,vin,vq)是顶点vp到vq的一条路径。若G是有向图,则路径也是有向的,其顶点序列应满足:,A(G)。,b) 路径长度:路径上边(或弧)的条数。,c) 简单路径:不重复出现同一顶点

8、的路径。,d) 回路(环):第一个顶点和最后一个顶点相同的路径。,e) 简单回路(或简单环):除第一个和最后一个顶点之外,路径上其余顶点不重复出现的回路。,12. 连通图(Connected Graph)和图的连通分量(Connected Component),a) 连通:若从顶点vi到vj存在一条路径,则称vi与vj是连通的。(注:有向图中,vi与vj连通,不一定有vj与vi连通),b) 若G中的任意两个不同顶点vi和vj都是连通的,则称G是连通图。,即:(vi, vjv(G), vivj), vi, vj是连通的,则G是连通图。,连通图,非连通图,c) 连通分量:无向图中的一个极大连通子图

9、(一个极大连通分支)。,例:G,如,是G的一个连通子图但不是极大连通子图。,上图G是一个非连通图,但它有三个连通分量,分别为:,和,d) 强连通图:在有向图G中,若对于每一对顶点vi, vjV(G), vivj,从vi到vj和从vj到vi都存在一条路径,则称G是强连通图。,(注意:并不要求vi到vj或vj到vi存在弧),e) 强连通分量:有向图中的一个极大强连通子图。,例:,3,存在两个强连通分量,和,图:,是强连通图,7.2 图的存储结构,图的存储结构通常有,用数组表示的邻接矩阵、邻接表、十字链表和邻接多重表。以下分别介绍:,1. 邻接矩阵(Adjacency Matrix) 数组表示法,用

10、两个数组分别存储数据元素(顶点)(一维)的信息和边(或弧)(二维)的信息。其形式描述如下:P161,1) 设图G=(V, R)是有n(n1)个顶点的图,则根据G中顶点间的邻接关系可用二维数组建立具有下列性质的nn阶的邻接矩阵作为G的存储结构。,即:,例:, 无向图:对称邻接矩阵, 有向图:非对称邻接矩阵,借助邻接矩阵可判定图中任意两个顶点vi、vj之间是否有边(或弧)相连,即:,无向图中各顶点的度: 第i行(或第j列)元素之和。即:,并可求得:,有向图中各顶点的度: 第i行元素之和为顶点vi的出度OD(vi),第j列元素之和为顶点vj的入度ID(vj),即:,2) 网的邻接矩阵可定义为:,wi

11、j为边(vi, vj) or 弧上的权值。,在无向图中根据其对称性,若要检测图中有多少条边,只需检测其上三角矩阵或下三角矩阵即可。,例:见P162页图7.9,2. 邻接表(Adjacency List) 链式存储,邻接表是图的一种链式存储结构。它是将图中的每一个顶点建立一个带表头结点的单链表,第i个单链表中的结点表示依附于顶点vi的边(有向图中是以vi为尾的弧)以及与vi相邻接的所有顶点;每个表头结点有序地存储在一个一维数组中,主要用于存储顶点的有关信息及指向该顶点对应的单链表的指针。,1) 邻接表中链表结点结构:,数据域:与vi有关的信息(序号),链域:指示链表中第一结点,b) 头结点:,注

12、:顶点在图中位置是人为的编排的,顶点在图中并没有顺序关系。,a) 表结点:,2) 邻接表的存储结构如下: P163,3) 结点结构:为简便起见,我们采用两个域的结点结构来建立邻接表:,注意:为使表头结点和表结点同构,我们均采用同一种结点结构来建立邻接表,省略表结点中的info域。,例:,无向图邻接表:,有向图邻接表:,注: 无向图中n个顶点,e条边,则其邻接表需n个头结点和2e个表结点。 表结点中,adjvex域存放顶点在数组中的序号。习惯上由大到小排列。,由邻接表可得:在无向图的邻接表中的第i个链表中的结点数等于顶点vi的度。,而对于有向图,第i个链表中的结点数是顶点的vi的出度。若要求顶点

13、vi的入度,则要遍历整个邻接表,求得邻接表中表结点的邻接点域adjvex的值=i1(顶点vi在数组中的序号)的结点的个数,即得顶点vi的入度。显然比较麻烦。为方便起见,我们可以建立另一个邻接表逆邻接表,即:对每个顶点vi建立一个以vi为弧头的邻接表,其表结点是连接vi的尾顶点,其头结点与上相同。,例:上图的逆邻接表:,注: 第i个链表中的结点数即为vi的入度; 邻接表容易找出顶点之间的邻接点,但要判断vi和vj之间是否存在边(或弧),则要搜索第i或第j个链表,不及邻接矩阵方便。,3. 十字链表(Orthogonal List)(略讲),是有向图的另一种链式存储结构,可以看成是将有向图的邻接表和

14、逆邻接表结合起来所得的一种链表。,1) 结点结构:每条弧有一个结点,每个顶点也有一个结点。,弧头顶点,指示弧头相同的下一条弧,弧相关的信息或权值等,a) 表(弧)结点:,弧尾顶点,指示弧尾相同的下一条弧,指向以该顶点为弧头的第一个弧结点,b) 头(顶点)结点:,与顶点相关的信息,指向以该顶点为弧尾的第一个弧结点,2) 有向图的十字链表存储表示如下: P165,4. 邻接多重表(Adjacency Multilist),是无向图的另一种链式存储结构。从无向图的邻接表可以看出,每条边(vi, vj)是两个顶点vi和vj表示,而它们分别在第i个链表和第j个链表中,这给某些图的操作带来不便。例如,某些

15、应用中需要对边进行操作,如对已搜索过的边作记号或删除一条边等,此时需要找到表示同一条边的两个结点。对于这类操作采用邻接多重表作为图的存储结构更为适宜。,1) 结点结构:邻接多重表的结构和十字链表类似,每条边用一结点表示,每个顶点也用一结点表示。,mark:标志域,标记该条边是否被搜索过。,ivex, jvex:为该边依附的两个顶点序号(在图中的位置),ilink, jlink:指针域,分别指向下一条依附于顶点ivex和顶点jvex的边。,a) 表(边)结点:,info:数据域,存储与边相关的信息的指针域。,指针域:指示第一条依附于该顶点的边,b) 头(顶点)结点:,数据域:存储与顶点相关的信息

16、,v1:e1 e2 e3,v2:e1 e4 e5,v3:e2 e4 e6,v4:e4 e5 e6,或:, 对于加权图也同样可以邻接表和邻接多重表来作为存储结构,只要加一个存放权值的域即可。, 除增加一个标志域外,邻接多重表所需存储空间与邻接表相同;各种基本操作也相似。, 邻接多重表与邻接表的差别:仅在于同一条边在邻接表中用两个结点表示,而在邻接多重表中只用一个结点表示,还可通过表头结点,把任一顶点依附的边都 接出来。,注:,2) 无向图的邻接多重表存储结构如下: P167,7.3 图的遍历与求图的连通分量,1. 图的遍历(Traversing Graph):对于图G=(V,R),从任意顶点vi

17、(viV(G)出发顺着G中的某些边(或弧)访问G中的每一个顶点,且只访问一次。,在遍历图的过程中,访问某个顶点之后,可能顺着某条路径再次访问该顶点。为了避免多次访问同一顶点,需设置一个一维辅助数组标识图中的顶点是否已被访问过,若G有n个顶点,则该数组大小为n。,即:Boolean visitedMAX;,visitedi =,TRUE 表示vi已被访问过,FALSE 表示vi未被访问过,注: “ TRUE”亦可以是“1”,或者被访问时的次序号;“FALSE”亦可以是“0”。,遍历图的两种方法:,a) 深度优先搜索法(Depth-First Search)(纵向优先搜索),基本思想:, 从图G(

18、V, R)中某一顶点v1出发访问与v1相邻的任意顶点w1, 再从w1出发,访问与w1邻接且未被访问过的顶点w2,再从w2出发,如此重复访问其未被访问的邻接点,直至一个所有邻接点都 被 访问过的顶点wk。然后逐步退回到wk-1,wk-2,w1找到一个还有邻接点未被访问过的顶点wj,(与树的先根遍历类似,是其推广), 从wj出发重复步,直至所有顶点都被访问过一次且仅一次。简称“DFS”。,v1,v2,v4,v8,v7,v3,v6,v5,或,或,例:P168,从V1出发可能得到的访问顺序有:,v1,v2,v5,v8,v4,v6,v3,v7,v1,v3,v6,v8,v7,v5,v2,v4,DFS递归算

19、法如下:P169,注:这是一个递归过程。附设访问标志数组Visitedn,初值为“FALSE”,一旦被访问,其值则为“TRUE”。,函数DFS算法如下:P169,DFS非递归算法如下:(补充),例:上图的邻接表:,注意:上图G的邻接表不是唯一的,以此邻接表为例图的存储结构,则执行DFSTraverse算法所得的顶点序列为:(从v1出发),v1,v3 ,v7 ,v8 ,v6 ,v5 ,v2 ,v4,若从另一顶点出发,则遍历后可得另一序列。(此时算法要适当修改,如何修改?请思考)。,b) 广度优先搜索(Breadth-First Search)(横向优先搜索),基本思想:, 从图G中的某一顶点v1

20、出发,访问与顶点v1邻接的全部邻接顶点,w1,w2,wx;, 依次访问与w1,w2,wx邻接且未被访问过的顶点,依此类推,直至所有顶点都 被访问为止。,上例图进行广度优先搜索可得:,v1,v2 ,v3 ,v4 ,v5 ,v6 ,v7 ,v8,(与树的层序遍历类似,是其推广),注:该遍历过程也要设一访问标志数组,并且为了顺次访问路径长度为2,3,的顶点,还要设队列,依次存储被访问的顶点。,BFS算法如下:P170,2. 求图的连通分量,求图的连通分量,实际上是图的遍历的一种应用。当无向图是非连通时,从图中的某一顶点v1为出发遍历图,只能访问到包含顶点v1的图的一个连通分量,而不能访问图中的所有顶

21、点。若要求含n个顶点的图的所有连通分量的顶点序列集,则可从任一新的顶点vi(1i n) 出发,反复遍历图,即可求得该图的全部连通分量。,检测图中的每一个顶点,若该顶点已被访问,则该顶点已落在图中已求得的某个连通分量上;若未被访问,则从该顶点出发遍历图,便可求得图的另一个连通分量。如此重复即可求得所有的连通分量。,具体方法是:,求图的连通分量算法:,例:,有三个连通分量,7.4 生成树和最小生成树,.生成树和生成森林,设是一个有n个顶点的连通图。 它的生成树是一个极小连通子图,即:它含有图中的全部顶点,但只有足以构成一棵树的n1条边。如:G=(V,T)是一棵生成树,即G是的子图,且G中含中的全部

22、顶点,仅有足以构成一棵树的n1条边,则子图G是的一棵生成树。 如果在一棵生成树上添加一条边,必定构成一环。因此一棵有n个顶点的生成树有且仅有n1条边。 若少于n1条边,则是非连通图,若多于n1条边,则一定有环。,1) 生成树,若从图中任一顶点出发遍历图时,必定将E(G)分成两个子集,分别记为B(G)和T(G),其中B(G)为遍历过程中没有走过的边,T(G)为遍历过程中走过的边。则子图G=(V, T)就是一棵生成树。而按DFS方法得的生成树为深度优先生成树,按BFS方法得到的生成树为广度优先生成树。,注意:反之,不一定成立,即:有n1条边的图不一定是生成树。,例:,G,DFS生成树:,BFS生成

23、树:,对于非连通图,每个连通分量均可生成一棵树,构成该非连通图的生成森林。,2) 生成森林,生成树及生成森林的算法:P171-172,3) 算法,2. 最小(代价)生成树,作为图的应用,若在n个城市之间建立通讯网络,连通n个城市仅需n1条线路即可。而最大可能建立n(n1)/2条线路。每条线路的建立都必须花费一定的代价,为节约起见,在建立n个城市的通讯网络时,一般考虑:, 建立n1条线路, 建立花费代价最小的n1条线路,我们可以用连通网来表示:把每一个城市作为一个顶点,每两个城市间的线路看成是关联两个顶点的边,则可绘制出n个城市间的通讯线路图正好是一棵生成树(一个生成树森林),每个生成树的每条线

24、路所花费的代价作为相应边的权,则生成树称为代价生成树。因此建立n个城市的通讯网问题就成为建立一最小代价生成树(Minimum Cost Spanning Tree) (简称为“最小生成树”)的问题。,注:对n个城市所建立的n1条边的网络图不唯一,可形成一个生成树森林。,一棵代价生成树T的代价:,则最小代价生成树的代价为:,其中,ST为生成树森林。,其中,Wi为第i条边的权值,如何构造最小生成树?其算法有多种。我们必须寻求一种方法,使得所构造的生成树的代价最小。两种基本方法是:普里姆(Prim)算法和克鲁斯卡尔(Kruskal)算法。,例 :给定如下图所示的网:,设U(T)是已落在最小生成树T中

25、的顶点集合,若顶点v和w都落在U(T)中,即v到w有一条连通路径,则边(v,w)加入T中必然构成回路。根据此思想,Prim提出了一种构造最小生成树的算法,用文字描述为:, 设集合U(T)的初态为空,, 在连通图上任选一顶点vi加入到U(T)中,1) 普里姆(Prim)算法, 将下列步骤重复n1次(或直到U(T)=V为止);,a) 从一顶点属于U(T) ,而另一顶点不属于U(T)的边中找权值最小的边(vi,vj) (vi U(T) , vj U(T) ),b) 将vj加入到U(T)中,c) 输出vi , vj 及wij,仍以上例图为例,从顶点1出发:,U(T)=1,=1, 2,=1, 2, 3,

26、U(T)1, 2, 3, 4, 6, 5,WG(T)=56,=1, 2, 3, 4,得生成树为:,存在另一棵最小生成树:,WG(T)=56,WG(T)=56,由此而得最小生成树也不是唯一的。,注:Prim算法与网中边数无关,适用于求边多的网的最小生成树;其时间复杂度为O(n2)。,普里姆(Prim)算法:P175 算法7.9,2) 克鲁斯卡尔(Kruskal)算法,设n个顶点的连通网N=(V,E),则Kruskal算法为:, 设最小生成树T的初始状态为只有n个顶点而无边的非连通图T=(T, ),且每个顶点自成一个连通分量;, 将下列步骤重复n-1次:,a) 在E中选择权值最小的边(vi,vj)

27、 E;,b) 若vi与vj之间不存在路径,则将(vi,vj)加入到T中,否则舍去此边而选择另一条权值最小的边;,c) 输出vi,vj及wij,即:直到T中所有顶点都在同一连通分量上为止。,仍以上例图为例:,T = (V, T(E)且T(E) = ,T(E) = (2,3),=(2,3), (2,4),=(2,3), (2,4), (2,6),(注:(3,4)舍去),=(2,3), (2,4), (2,6), (1,2),=(2,3), (2,4), (2,6), (1,2), (4,5),此时:WG(T) = 56,注:Kruskal算法适用于求边少的网的最小生成树;其时间复杂度为O(e*loge)。,克鲁斯卡尔(Kruskal)算法: (自编),图是一种复杂的非线性结构,这一章对我们来说,内容繁多,如果全部深入掌握是很困难的,所以我们要抓住基本点加以学习和理解,对某些算法的实现可以不必深究,或只作为学习时的参考。我们要掌握的重点内容是图的基本概念,两种常用的存储结构(邻接矩阵和邻接表),两种遍历算法(DFS和BFS)及图的应用算法(最小生成树,求拓扑排序、关键路径以及最短路径)。只要求对这些算法的基本思想和时间性能进行掌握。这也是本章的难点。,本章小结:,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 网络科技 > 数据结构与算法

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报