收藏 分享(赏)

6-第六章.ppt

上传人:11xg27ws 文档编号:7353474 上传时间:2019-05-15 格式:PPT 页数:84 大小:1.53MB
下载 相关 举报
6-第六章.ppt_第1页
第1页 / 共84页
6-第六章.ppt_第2页
第2页 / 共84页
6-第六章.ppt_第3页
第3页 / 共84页
6-第六章.ppt_第4页
第4页 / 共84页
6-第六章.ppt_第5页
第5页 / 共84页
点击查看更多>>
资源描述

1、第六章 图,浙江工商大学,第六 章 图,学习要点1熟悉图的各种存储结构及其构造算法,了解实际问题的求解效率与采用何种存储结构和算法有密切联系;2熟练掌握图的两种遍历:深度优先遍历和广度优先遍历的算法。在学习中应注意图的遍历算法与树的遍历算法之间的类似和差异。树的先根遍历是一种深度优先搜索策略,树的层次遍历是一种广度优先搜索策略3理解各种图的算法;,6.1 图的基本概念,一 图的概念图的定义图G由两个集合构成,记作G= 其中V是顶点的非空有限集合,E是边的有限集合,其中边是顶点的无序对或有序对集合。,G1= V=v0 ,v1,v2,v3,v4 E=(v0,v1),(v0,v3),(v1,v2),

2、(v1,v4),(v2,v3)(v2,v4),G1图示,无序对(vi,vj): 用连接顶点vi、vj的线段 表示,称为无向边;,G2 图示,有序对 : 用以vi起点、以vj为终点 的有向线段表示,称为有向 边或弧;称vi为弧尾,vj为弧头,无向图:在图G中,若所有边是无向边,则称G为无向图; 有向图:在图G中,若所有边是有向边,则称G为有向图; 混和图:在图G中,既有无向边也有有向边,则称G为混合图;,G2= V=v0 v1,v2,v3 E= , , ,图的应用举例 例1 交通图(公路、铁路)顶点:地点边:连接地点的公路交通图中的有单行道双行道,分别用有向边、无向边表示; 例2 电路图顶点:元

3、件边:连接元件之间的线路 例3 通讯线路图顶点:地点边:地点间的连线 例4 各种流程图如产品的生产流程图顶点:工序边:各道工序之间的顺序关系,1 邻接点及关联边邻接点:边的两个顶点,v、u互为邻接点关联边:若边e= (v, u), 则称顶点v、u 关联边e 2 顶点的度、入度、出度在无向图中: 顶点V的度 = 与V相关联的边的数目在有向图中: 顶点V的出度=以V为起点有向边数顶点V的入度=以V为终点有向边数顶点V的度 = V的出度+V的入度设图G的顶点数为n,边数为e图的所有顶点的度数和 = 2*e(每条边对图的所有顶点的度数和“贡献”2度),e,图的基本术语,完全图、权、网有向完全图具有n(

4、n-1)条弧的n个顶点的有向图称为无向完全图有n(n-1)/2 条边的n个顶点的无向图称为权与图的边或弧相关的数叫网带权的图叫,4 路径、回路路径路径是顶点的序列V=V0,V1,Vn,满足(Vi-1,Vi)E,(1in)路径长度沿路径边的数目或沿路径各边权值之和回路第一个顶点和最后一个顶点相同的路径叫回路在图G1中,V0,V1,V2,V3 是V0到V3的路径;V0,V1,V2,V3,V0是回路; 在图G2中,V0,V2,V3 是V0到V3的路径; V0,V2,V3,V0是回路;,无向图G1,有向图G2,例,5 简单路径和简单回路在一条路径中,序列中顶点不重复出现的路径称为简单路径;由简单路径组

5、成的回路称为简单回路; 在图G1中,V0,V1,V2,V3 是简单路径;在图G2中, V0,V2,V3,V0是简单回路;,无向图G1,有向图G2,例,6 连通图(强连通图)在无(有)向图G=中,若对任何两个顶点 v、u 都存在从v 到 u 的路径,则称G是连通图(强连通图),非连通图,连通图,强连通图,非强连通图,7 子图设有两个图G=(V,E)、G1=(V1,E1),若V1 V,E1 E,则称 G1是G的子图;例 (b)、(c) 是 (a) 的子图,(a),(b),(c),8 连通分量(强连通分量)无向图G 的极大连通子图称为G的连通分量极大连通子图意思是:该子图是 G 连通子图,将G 的任

6、何不在该子图中的顶点加入,子图不再连通;,连通分量,非连通图,有向图D 的极大强连通子图称为D 的强连通分量极大强连通子图意思是:该子图是D强连通子图,将D的任何不在该子图中的顶点加入,子图不再是强连通的;,连通图 G1,G1的生成树,T1是G1的生成树,图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),3,4,1,3,1,0,路径:1,2,3,5,6,3 路径长度: 简单路径:1,2,3,5,6,3,13,5

7、,6,3,路径:1,2,5,7,6,5,2,3 路径长度:7 简单路径: 回路: 1,2,5,7,6,5,2,1 简单回路:,5,1,2,3,5,6,回路:,简单回路:,1,2,5,7,6,1,2,3,1,连通图,强连通图,非连通图 连通分量,6.2 图的存储结构 多重链表,邻接矩阵表示顶点间相联关系的矩阵 定义:设G=(V,E)是有n1个顶点的图,G的邻接矩阵A是具有以下性质的n阶方阵,数组表示法,特点: 无向图的邻接矩阵对称,可压缩存储;有n个顶点的无向图需存储空间为n(n+1)/2 有向图邻接矩阵不一定对称;有n个顶点的有向图需存储空间为n 无向图中顶点Vi的度TD(Vi)是邻接矩阵A中

8、第i行(或第i列)元素之和 有向图中, 顶点Vi的出度是A中第i行元素之和 顶点Vi的入度是A中第i列元素之和,检测图中的总边数。扫描整个数组A,统计出数组中非0元素的个数。无向图的总边数为非0元素个数的一半,而有向图的总弧数为非0元素个数;,网的邻接矩阵可定义为:,邻接矩阵表示法中图的存储表示 #define n 6 /*图的顶点数*/ #define e 8 /*图的边数*/ typedef char vextype; /*顶点的数据类型*/ typedef float adjtype; /*权值类型*/ typedef struct vextype vexsn;adjtype arcsn

9、n; graph;,2,1,4,3,5,B,A,D,C,E,2,1,5,3,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,=,80,70,80,70,50,40,50,30,40,20,30,20,arcs,6,20,30,50,40,70,80,邻接矩阵表示法中无向网络的建立算法 CREATEGRAPH(graph *ga) int i,j,k;float w;for (i=0;ivexsigetchar(); /*读入顶点信息,建立顶点表*/for (i=0;iarcsij0; /*邻接矩阵初始化*/for (k=0;karcsijw;

10、ga-arcsjiw; ,邻接表 实现: 顶点:通常按编号顺序将顶点数据存储在一维数组中;关联同一顶点的边:用线性链表存储。即为图中每个顶点建立一个单链表,第i个单链表中的结点表示依附于顶点Vi的边,该结点表示边 (Vi Vj),其中的2是Vj 在一维数组中的位置,特点 无向图中顶点Vi的度为第i个单链表中的结点数 有向图中 顶点Vi的出度为第i个单链表中的结点个数 顶点Vi的入度为整个邻接矩阵中邻接点域值是i的结点个数 判定两顶点v,u是否邻接:要看v对应线性链表中有无对应的结点u 在G中增减边:要在两个单链表插入、删除结点; 设存储顶点的一维数组大小为m(m图的顶点数n), 图的边数为e,

11、G占用存储空间为:m+2*e。G占用存储空间与G的顶点数、边数均有关;适用于边稀疏的图,逆邻接表:有向图中对每个结点建立以Vi为头的弧的单链表,顶点:用一维数组存储(按编号顺序) 以同一顶点为终点的弧:用线性链表存储,有向图的十字链表表示法,有向图的十字链表表示法,每个结点代表了一条边 根据边的出发(弧头)和结束(弧尾)分别把节点用单链表串接。,无向图的邻接多重表表示法,6.3 图的遍历从图的某顶点出发,访问图中所有顶点,并且每个顶点仅访问一次。,深度优先遍历,一、方法,1)从图中某顶点v出发,访问该顶点; 2)依次从v的未被访问的邻接点出发继续对图进行深度优先遍历,直至图中所有和v有路径相通

12、的顶点都被访问到; 3)若图中仍有顶点未被访问, 则另选一个未曾被访问的顶点作起始点,重复上述过程,直到图中所有顶点都被访问为止。,从图中某顶点v出发: 1)访问顶点v; 2)依次从v的未被访问的邻接点出发,继续对图进行深度优先遍历;,序列1: V0,V1,V3,V7,V4,V2,V5,V6,由于没有规定 访问邻接点的顺序, 深度优先序列不是唯一的,这是序列1 在遍历过程中 所经过的路径,例,求图G以V0起点的的深度优先序列:,序列2: V0,V1,V4,V7,V3,V2,V5,V6,深度遍历:V1,V3 ,V7 ,V6 ,V2 ,V5 ,V8 ,V4,深度遍历:V1,V3 ,V7 ,V6 ,

13、V2 ,V4 ,V8 ,V5,二、深度优先遍历算法这是一递归过程。为了区分顶点是否已被访问,需附设标志数组visitedMax,当顶点vi未被访问,visitedi值为false,当vi已被访问,则visitedi值为true。,整个图的遍历算法如下: (整个图深度优先遍历的算法)void DFSTraverse (Graph G, Status( *Visit) (int v )VisitFunc=Visit;for ( v=0; v=0; w=NextAdjVex(G,v,w) if (!visited w ) DFS(G,w); ,图中有 n 个顶点,e 条边。 如果用邻接表表示图,沿链

14、可以找到某个顶点 v 的所有邻接顶点 w。由于总共有 2e 个边结点,所以扫描边的时间为O(e)。而且对所有顶点递归访问1次,所以遍历图的时间复杂性为O(n+e)。 如果用邻接矩阵表示图,则查找每一个顶点的所有的边,所需时间为O(n),则遍历图中所有的顶点所需的时间为O(n2)。,三、算法分析,深度遍历:V1 V2 V4 V8 V5 V6 V3 V7,深度遍历:V1 V2 V4 V8 V5 V6 V3 V7,深度遍历:V1 V2 V4 V8 V3 V6 V7 V5,广度优先遍历,一、方法,1)从图中某顶点v出发,访问该顶点; 2)依次访问V0的各个未曾访问过的邻接点; 3)然后分别从这些邻接点

15、出发,广度优先遍历图,直至图中所有已被访问的顶点的邻接点都被访问到; 4)若图中仍有顶点未被访问, 则另选一个未曾被访问的顶点作起始点,重复上述过程,直到图中所有顶点都被访问为止。,图中某未访问过的顶点vi出发: 1)访问顶点vi ; 2)访问 vi 的所有未被访问的邻接点w1 ,w2 , wk ; 3)依次从这些邻接点出发,访问它们的所有未被访问的邻接点; 依此类推,直到图中所有访问过的顶点的邻接点都被访问;,这是序列(1) 在遍历过程中 所经过的路径,由于没有规定 访问邻接点的顺序, 广度优先序列不是唯一的,例,求图G 的以V0起点的的广度优先序列,V0,V1,V2,V3,V4,V5,V6

16、,V7,V0,V1,V2,V3,V4,V5,V6,V7,V1,V2,V3,V0,V4,V5,V6,V7,在广度优先遍历算法中, 需设置一队列Q, 保存已访问的顶点, 并控制遍历顶点的顺序。,广度遍历:V1 V2 V3 V4 V5 V6 V7 V8,广度遍历:V1 V2 V3 V4 V6 V7 V8 V5,二、广度优先遍历算法 1)为了区分顶点是否已被访问,需附设标志数组visitedMax,2)为顺次广度访问各顶点,需附设队列以存储已被访问的顶点,整个图的遍历算法如下: (整个图广度优先遍历的算法)void BFSTraverse (Graph G, Status( *Visit) (int

17、v )for (v=0;v=0; w=NextAdjVex(G,u,w)if (!visitedw) visitedw=true; visit(w);EnQueue(Q,w);/if/while/if /BFSTraverse,如果使用邻接表表示图,则循环的总时间代价为 d0 + d1 + + dn-1 = O(e),其中的 di 是顶点 i 的度。 如果使用邻接矩阵,则对于每一个被访问过的顶点,循环要检测矩阵中的 n 个元素,总的时间代价为O(n2)。,三、算法分析,广度遍历:V1 V2 V3 V4 V5 V6 V7 V8,广度遍历:V1 V2 V3 V4 V5 V6 V7 V8,深度遍历:

18、V1 V2 V4 V8 V5 V6 V3 V7,深度遍历:V1 V2 V4 V8 V5 V6 V3 V7,广度遍历:V1 V2 V3 V4 V6 V7 V8 V5,深度遍历:V1 V2 V4 V8 V3 V6 V7 V5,6.4 生成树 生成树 定义:所有顶点均由边连接在一起,但不存在回路的图叫 深度优先生成树与广度优先生成树 生成森林:非连通图每个连通分量的生成树一起组成非连通图的 说明 一个图可以有许多棵不同的生成树 所有生成树具有以下共同特点: 生成树的顶点个数与图的顶点个数相同 生成树是图的极小连通子图 一个有n个顶点的连通图的生成树有n-1条边 生成树中任意两个顶点间的路径是唯一的

19、在生成树中再加一条边必然形成回路 含n个顶点n-1条边的图不一定是生成树,深度遍历:V1 V2 V4 V8 V5 V3 V6 V7,广度遍历:V1 V2 V3 V4 V5 V6 V7 V8,最小生成树 问题提出,要在n个城市间建立通信联络网, 顶点表示城市 权城市间建立通信线路所需花费代价 希望找到一棵生成树,它的每条边上的权值之和(即建立 该通信网所需花费的总代价)最小最小代价生成树,问题分析,n个城市间,最多可设置n(n-1)/2条线路 n个城市间建立通信网,只需n-1条线路 问题转化为:如何在可能的线路中选择n-1条,能把所有城市(顶点)均连起来,且总耗费(各边权值之和)最小,构造最小生

20、成树方法 方法一:普里姆(Prim)算法 算法思想:设N=(V,E)是连通网,TE是N上最小生成树中边的集合 初始令U=u0,(u0V), TE= 在所有uU,vV-U的边(u,v)E中,找一条代价最小的边(u0,v0) 将(u0,v0)并入集合TE,同时v0并入U 重复上述操作直至U=V为止,则T=(V,TE)为N的最小生成树,Ch6_3.c,求解: 连通6个城市且代价最小的交通线路?,U= V1 ,U= V1,V3 ,U= V1,V3,V6,U= V1,V3,V6,V4 ,U= V1,V3,V6,V4,V2 ,U= V1,V3,V6,V4,V2,V5 ,6.4 最小的生成树, 基本步骤 设

21、G=(V,E)为一个具有n个顶点的带权的连通网络,最小生成树的初始状态为有n 个顶点但无边的非连通图 T=(V, )。 (1)将E 中的边按权值的递增顺序排序,选择权值最小的边,若与相关的顶点落在T 中不同的连通分量上,则将其加入T 中,否则,将其弃舍。 (2)循环至所有顶点在同一的连通分量上。 如何识别一条边所相关的顶点是否落在同一个连通分量上?可将一个连通分量的所有顶点看成一个集合,当从E中取出一条边( xi, xj )时,若xi, xj 在同一集合u 中,则将该边弃舍;否则,则将该边加入到T 中,并将xj 所在的集合v 并入集合u 中。,三 克鲁斯卡尔算法,6.4 最小的生成树,方法二:

22、克鲁斯卡尔(Kruskal)算法 算法思想:设连通网N=(V,E),令最小生成树 初始状态为只有n个顶点而无边的非连通图T=(V,),每个顶点自成一个连通分量 在E中选取代价最小的边,若该边依附的顶点落在T不会构成回路,则将此边加入到T中;否则,舍去此边,选取下一条代价最小的边 依此类推,6.5 最短路径 问题提出,用带权的有向图表示一个交通运输网,图中: 顶点表示城市 边表示城市间的交通联系 权表示此线路的长度或沿此线路运输所花的时间或费用等 问题:从某顶点出发,沿图的边到达另一顶点所经过的路径中,各边上权值之和最小的一条路径最短路径,从某个源点到其余各顶点的最短路径,13,8,13,19,

23、21,20,迪杰斯特拉(Dijkstra)算法思想,按路径长度递增次序产生最短路径算法: 把所有的顶点分成两组: (1)S:已求出最短路径的顶点的集合 (2)T:尚未确定最短路径的顶点集合,S=V0,V1, V2, V3Vi T=M1, M2, M3Mi S中,V0到其他各个顶点Vi的最短路径和最短路径长度已经求出。(当前) 设V0-Vk- Mp 是V0以S中的顶点为中间点,到T中所有顶点的最短路径(注意, Mp 必须通过V的顶点直接到达)。那么这个路径一定是V0到Mp最短路径,其长度是最短路径长度。,Dijkstra基本原理,S=V0,V1, V2, V3Vi T=M1, M2, M3Mj

24、S中,V0到其他各个顶点Vi的最短路径和最短路径长度已经求出。(当前) 设V0-Vk- Mp 是V0以S中的顶点为中间点,到T中所有顶点的最短路径(注意, Mp 必须由V的顶点直接到达)。那么这个路径一定是V0到Mp最短路径,其长度是最短路径长度。,1383032V2:8 ,13- 133032V1:13 ,- 13302220V3:13 ,- 192220V4:19 ,- 2120V6:20 ,注意: 1 :前一列的信息 2:当前列跟新那些信息,算法实现 图用带权邻接矩阵存储ad 数组dist存放当前找到的从源点V0到每个终点的最短路径长度,其初态为图中直接路径权值 数组pre表示从V0到各

25、终点的最短路径上,此顶点的前一顶点的序号;若从V0到某终点无路径,则用0作为其前一顶点的序号,算法描述,13,8,13,19,21,20,算法分析:T(n)=O(n),/cost:邻接矩阵,distance: v到其他顶点的距离 /found:已经发现的顶点 for(i=0;in;i+) foundi=FALSE; /初始化distancei=costvi; foundv=TRUE;distancev=0; for(i=0;in;i+) u=choose(distance,n,found); /找最短路径顶点foundu=TRUE;for(w=0;wn;w+)if (foundw=FALSE)

26、if (distanceu+costuwdistancew)distancew=distanceu+costuw; ,每一对顶点之间的最短路径 方法一:每次以一个顶点为源点,重复执行Dijkstra算法n次 T(n)=O(n) 方法二:弗洛伊德(Floyd)算法 算法思想:逐个顶点试探法 求最短路径步骤 初始时设置一个n阶方阵,令其对角线元素为0,若存在弧,则对应元素为权值;否则为 逐步试着在原直接路径中增加中间顶点,若加入中间点后路径变短,则修改之;否则,维持原值 所有顶点试探完毕,算法结束, 6.6 有向无环图及其应用 问题提出:学生选修课程问题 顶点表示课程 有向弧表示先决条件,若课程i

27、是课程j的先决条件,则图中有弧 学生应按怎样的顺序学习这些课程,才能无矛盾、顺利地完成学业拓扑排序定义 AOV网用顶点表示活动,用弧表示活动间优先关系的有向图称为顶点表示活动的网(Activity On Vertex network),简称AOV网 若是图中有向边,则vi是vj的直接前驱;vj是vi的直接后继 AOV网中不允许有回路,这意味着某项活动以自己为先决条件,拓扑排序把AOV网络中各顶点按照它们相互之间的优先关系排列成一个线性序列的过程叫 检测AOV网中是否存在环方法:对有向图构造其顶点的拓扑有序序列,若网中所有顶点都在它的拓扑有序序列中,则该AOV网必定不存在环 拓扑排序的方法 在有

28、向图中选一个没有前驱的顶点且输出之 从图中删除该顶点和所有以它为尾的弧 重复上述两步,直至全部顶点均已输出;或者当图中不存在无前驱的顶点为止,拓扑序列: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网的拓扑序列不是唯一的,算法实现 以邻接表作存储结构 把邻接表中所有入度为0的顶点进栈 栈非空时,输出栈顶元素Vj并退栈;在邻接表中查找Vj的直接后继Vk,把Vk的入度减1;若Vk的入度为0则进栈 重复上述操作直至栈空为止。若栈空时输出的顶点个数不是n,则有向图有环;否则,拓

29、扑排序完毕,邻接表结点: typedef struct node int vex; /顶点域struct node *next; /链域 JD;,表头结点: typedef struct tnode int in; /入度域struct node *link; /链域 TD; TD gM; /g0不用,算法分析,建邻接表:T(n)=O(e) 搜索入度为0的顶点的时间:T(n)=O(n) 拓扑排序:T(n)=O(n+e),Ch6_4.c,6.6 关键路径 问题提出,把工程计划表示为有向图,用顶点表示事件,弧表示活动; 每个事件表示在它之前的活动已完成,在它之后的活动可以开始,例 设一个工程有11

30、项活动,9个事件 事件 V1表示整个工程开始 事件V9表示整个工程结束 问题:(1)完成整项工程至少需要多少时间?(2)哪些活动是影响工程进度的关键?,定义 AOE网(Activity On Edge)也叫边表示活动的网。AOE网是一个带权的有向无环图,其中顶点表示事件,弧表示活动,权表示活动持续时间 路径长度路径上各活动持续时间之和 关键路径路径长度最长的路径叫关键路径 关键路径上的结点称为关键结点 Ve(j)表示事件Vj的最早发生时间 Vl(j)表示事件Vj的最迟发生时间 e(i)表示活动ai的最早开始时间 l(i)表示活动ai的最迟开始时间 l(i)-e(i)表示完成活动ai的时间余量

31、关键活动关键路径上的活动叫,即l(i)=e(i)的活动,问题分析 如何找e(i)=l(i)的关键活动?,设活动ai用弧表示,其持续时间记为:dut() 则有:(1)e(i)=Ve(j)(2)l(i)=Vl(k)-dut(),如何求Ve(j)和Vl(j)?,(1)从Ve(1)=0开始向前递推,(2)从Vl(n)=Ve(n)开始向后递推,求关键路径步骤 求Ve(i) 求Vl(j) 求e(i) 求l(i) 计算l(i)-e(i),V1 V2 V3 V4 V5 V6 V7 V8 V9,0 6 4 5 7 7 16 14 18,0 6 6 8 7 10 16 14 18,a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11, ,

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

当前位置:首页 > 企业管理 > 管理学资料

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


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

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

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