收藏 分享(赏)

数据结构第七章 图.ppt

上传人:谈谈 文档编号:1648925 上传时间:2018-08-15 格式:PPT 页数:150 大小:1.26MB
下载 相关 举报
数据结构第七章 图.ppt_第1页
第1页 / 共150页
数据结构第七章 图.ppt_第2页
第2页 / 共150页
数据结构第七章 图.ppt_第3页
第3页 / 共150页
数据结构第七章 图.ppt_第4页
第4页 / 共150页
数据结构第七章 图.ppt_第5页
第5页 / 共150页
点击查看更多>>
资源描述

1、7.1 图的定义和术语7.2 图的存储结构7.3 图的遍历7.4 图的连通性问题7.5 有向无环图的应用7.6 最短路径,第7章 图,本章重点难点,重点:(1)图的定义、术语和性质;(2)ADT图的设计和实现;(3)图的邻接矩阵、邻接表的存储结构及其构造方法;(4)图的两种遍历方法:深度优先遍历和广度优先遍历;(5)最小生成树的算法、拓扑排序的算法;(6)理解关键路径的算法,构造最短路径的Dijkstra算法和Floyed算法。,难点:有向无环图的关键路径算法,求最短路径的Dijkstra算法和Floyed算法。,7.1 图的定义和术语7.2 图的存储结构7.3 图的遍历7.4 图的连通性问题

2、7.5 有向无环图的应用7.6 最短路径,第七章 图,7.1 图的定义和术语,图G由两个集合构成,记作G= 其中V是顶点的非空有限集合,E是边的有限集合,其中边是顶点的无序对或有序对集合。,图的定义,例,G1= V1=v0 ,v1,v2,v3,v4 E1= (v0,v1),(v0,v3),(v1,v2),(v1,v4),(v2,v3)(v2,v4) ,无向图(Undigraph) :在图G中,若所有边是无向边,则称G为无向图; 有向图(Digraph) :在图G中,若所有边是有向边,则称G为有向图;有向边也称为弧(Arc)。,图的术语,7.1 图的定义和术语,G1图示,V0,V4,V3,V1,

3、V2,V0,V1,V2,V3,G2 图示,无向图,有向图,无向完全图(Undirected Complete Graph): 无向图且边数为n(n-1)/2,则称其为无向完全图; 有向完全图(Directed Complete Graph): 有向图且边数为n(n-1) ,则称其为有向完全图,图的术语,7.1 图的定义和术语,邻接点及关联边邻接点:边的两个顶点关联边:若边e= (v, u), 则称顶点v、u 关连边e,顶点的度: 一个顶点v的度是与它相关联的边的条数,记作D(v)。 顶点v的入度是以v为终点的有向边的条数, 记作ID(v); 顶点v的出度是以v为始点的有向边的条数,记作 OD(

4、v)。,图的术语,7.1 图的定义和术语,顶点数、边数e和度数D(v)之间的关系:,图的术语,7.1 图的定义和术语,路径、回路: 有向图D=(V,E)中的顶点序列v1,v2, ,vk, 若E (i=1,2,k-1), v =v1, u =vk, 则称该序列是从顶点v到顶点u的路径;若v=u,则称该序列为回路;,路径、回路:无向图G=(V,E)中的顶点序列v1,v2, ,vk,若(vi,vi+1)E( i=1,2,k-1), v =v1, u =vk, 则称该序列是从顶点v到顶点u的路径;若v=u,则称该序列为回路;,在图1中,V0,V1,V2,V3 是V0到V3的路径;V0,V1,V2,V3

5、,V0是回路; 在图2中,V0,V2,V3 是V0到V3的路径;V0,V2,V3,V0是回路;,无向图G1,有向图G2,例,V0,V4,V3,V1,V2,V0,V1,V2,V3,7.1 图的定义和术语,图的术语,7.1 图的定义和术语,简单路径和简单回路: 在一条路径中,若除起点和终点外,所有顶点各不相同,则称该路径为简单路径;由简单路径组成的回路称为简单回路;,在图1中,V0,V1,V2,V3 是简单路径; V0,V1,V2,V4,V1不是简单路径。 在图2中, V0,V2,V3,V0是简单回路。,无向图G1,有向图G2,例,V0,V4,V3,V1,V2,V0,V1,V2,V3,7.1 图的

6、定义和术语,图的术语,7.1 图的定义和术语,连通图(强连通图): 在无(有)向图G=中,若对任何两个顶点 v、u 都存在从v 到 u 的路径,则称G是连通图(强连通图),图的术语,7.1 图的定义和术语,子图: 设有两个图G=(V,E)、G1=(V1,E1),若V1 V,E1 E,E1关联的顶点都在V1中,则称 G1是G的子图;,权: 某些图的边具有与它相关的数, 称之为权。 这种带权图叫做网络。,图的术语,7.1 图的定义和术语,生成树:连通图的一个子图如果是一棵包含G的所有顶点的树,则该子图称为G 的生成树。,T是G 的生成树当且仅当T 满足如下条件,T是G 的连通子图 T包含G 的所有

7、顶点 T中无回路,ADT Graph 数据对象V:数据关系R:基本操作 ADT Graph,7.1 图的定义和术语,图的抽象数据类型定义,V是具有相同特征的数据元素的集合,称为顶点集。,R=VR VR=v,wV且P(v,w),见下页,CreatGraph(&G) /建立图,DestroyGraph(&G) /销毁图,基本操作,7.1 图的定义和术语,InsertVEx(&G, v) /插入顶点,DeleteVEx(&G, v) /删除顶点,InsertArc(&G, v, w) /插入弧,DeleteArc(&G, v, w) /删除弧,DFSTraVErse(G, v, Visit() /深

8、度优先搜索,BFSTraVErse(G, v, Visit() /广度优先搜索,7.1 图的定义和术语7.2 图的存储结构7.3 图的遍历7.4 图的连通性问题7.5 有向无环图的应用7.6 最短路径,第七章 图,7.2.1、数组表示法 7.2.2、邻接表,7.2 图的存储结构,图的存储结构至少要保存两类信息: (1)顶点的数据 (2)顶点间的关系,约定:图G=, V=v0,v1,v2, vn-1 ,顶 点的角标为它的编号。,如何表示顶点间的关系?,?,7.2 图的存储结构,邻接矩阵 (Adjacency Matrix),7.2.1 数组表示法,G的邻接矩阵是满足如下条件的n阶矩阵:,Aij=

9、,1 若(vi,vi+1)E 或 E 0 否则,0 1 2 3 0 0 1 1 1 1 1 0 0 1 2 1 0 0 1 3 1 1 1 0,讨论: (1)无向图中第i个顶点的度在邻接矩阵中如何体现? (2)图的总度数怎么求, (3)边数怎么求?,7.2.1 数组表示法,V0,V2,V1,V3,例,无向图的邻接矩阵,0 1 2 3 0 0 1 1 1 1 1 0 0 1 2 1 0 0 1 3 1 1 1 0,答案: (1)第i行(或第i列)的非零元素个数之和; (2)非零元个数之和; (3)边数为总度数的一半。,7.2.1 数组表示法,V0,V2,V1,V3,例,无向图的邻接矩阵,0 1

10、2 3 4,0 1 2 3 4,0 1 1 0 0,0 0 1 0 0,0 0 0 1 00 0 0 0 11 0 0 0 0,v0,v4,v2,v1,v3,讨论: 有向图中第i个顶点的出度和入度在邻接矩阵中如何体现? 边数是多少?,例,7.2.1 数组表示法,有向图的邻接矩阵,0 1 2 3 4,0 1 2 3 4,0 1 1 0 0,0 0 1 0 0,0 0 0 1 00 0 0 0 11 0 0 0 0,v0,v4,v2,v1,v3,答案: 第i行的非零元个数之和; 第i列的非零元个数之和; 边数为非零元的个数。,例,7.2.1 数组表示法,有向图的邻接矩阵,网络的邻接矩阵,7.2.1

11、 数组表示法,网络的邻接矩阵是满足如下条件的n阶矩阵:,Aij=,Wij 若(vi,vi+1)E 或 E 0 或 否则,边带权图(网)的邻接矩阵示例:,0 1 2 3 4,0 1 2 3 4, 2 , 4 , 2 22 ,v0,v4,v2,v1,v3,2,2,4,2,2,7.2.1 数组表示法,例,讨论:无穷大在实际应用中怎么表示?,答案:用一个足够大的数表示。,#define INFINITY INT_MAX /最大值 #define MAX_VERTEX_NUM /最大顶点个数 Typedef enum DG,DN,UDG,UDN GraphKind; typedef struct Arc

12、Cell / 弧的定义VRType adj; / VRType是顶点关系类型InfoType *info; / 该弧相关信息的指针 ArcCell, AdjMatrixMAX_VERTEX_NUM MAX_VERTEX_NUM;,7.2.1 数组表示法,邻接矩阵的类型实现,7.2.1 数组表示法,图的类型实现,typedef struct / 图的类型定义VErtexType / 顶点信息vexsMAX_VERTEX_NUM; AdjMatrix arcs; / 弧的信息 int vexnum, arcnum; / 顶点数,弧数 GraphKind kind; / 图的种类标志 MGraph;

13、MGraph G;,2,1,5,3,4,6,20,30,50,40,70,80,7.2.1 数组表示法,网的存储示例图,例,建立无向网络(边带权图)G的算法概要:,7.2.1 数组表示法,首先读入顶点数G.VExnum,边数G.arcnum,图的种类G.kind 1、给顶点域赋值:G.vexsi; 2、给边域赋值: 边域初始化:G.arcsij.adj=INFINITY; 读入边及权重i,j,w, G.arcsij.adj=W; G.arcsji.adj=W。,void Creatgraph(MGraph ,7.2.1 数组表示法,建立无向网络(边带权图)G的算法详解:,见下页,for(i=1

14、;i=G.VExnum;i+)for(j=1;j=G.VExnum;j+)G.arcsij.adj=INFINITY; G.arcsij.info=NULL;for (k=1;k=G.arcnum;k+) scanf(“%d,%d,%f”, ,接上页,7.2.1 数组表示法,邻接矩阵的特点,7.2.1 数组表示法,(1)空间复杂度O(n2) (2)操作特点边或弧的删除和插入操作容易。顶点的插入删除操作不容易。,无向图的邻接表示例:,0 1 2 3 4,讨论:如何求无向图邻接表中第i个顶点的度?图的总度数,边数?,边表,顶点表,7.2.2 邻接表,例,V0,V2,V1,V3,无向图的邻接表示例:

15、,讨论:如何求无向图邻接表中第i个顶点的度?图的总度数?边数?,7.2.2 邻接表,例,V0,V2,V1,V3,答案:第i个顶点的边链表结点个数之和。所有边链表结点个数之和。所有边链表结点个数之和的一半。,v1,v5,v4,v2,v3,出边表,顶点表,讨论:求有向图邻接表中第i个顶点的出度?图的边数?,有向图的邻接表示例:,例,7.2.2 邻接表,v1,v5,v4,v2,v3,讨论:求有向图邻接表中第i个顶点的出度?图的边数?,有向图的邻接表示例:,例,答案:第i个顶点的边链表结点个数之和。所有边链表结点个数之和。,7.2.2 邻接表,边链表:与顶点V关联的所有边组成一个链表,称为顶点V的边链

16、表。在边链表中,其结点结构如下:,邻接表的定义分两部分:,边链表: 顶点表:,表结点,7.2.2 邻接表,邻接表的定义,顶点表:用顺序存储方式存储图的顶点表v1,v2,v3,vn,每个顶点的结构。,邻接表:由顺序存储的顶点表和链接存储的边链表构成的图的存储结构被称为邻接表。,7.2.2 邻接表,邻接表的定义,邻接表的存储实现,7.2.2 邻接表,#define MAX_VERTEX_NUM 20 (1)边表的存储类型: typedef struct ArcNode int adjvex; / 该弧所指向的顶点的位置struct ArcNode *nextarc; / 指向下一条弧的指针Info

17、Type *info; / 该弧相关信息的指针 ArcNode;,(2)顶点表的存储类型: typedef struct vnode vertextype data; / 顶点信息Arcnode *firstarc; / 指向第一条依附该顶点的弧 vnode, adjlistMAX_VERTEX_NUM;,邻接表的存储实现,7.2.2 邻接表,(3)图的邻接表存储类型:typedef struct adjlist vertices;int vexnum, arcnum; int kind; / 图的种类标志 ALGraph;ALGraph G;,邻接表的存储实现,7.2.2 邻接表,(1)、给

18、顶点表中顶点域赋值,指针域赋值 G.VErticesi.data=getchar(); G.VErticesi.firstarc=NULL;,7.2.2 邻接表,建立无向图G的邻接表的算法概要:,(2)、读入边的邻接顶点编号i,j: 生成结点s; 前插法建表;s-nextarc= G.VErticesi.firstarc;G.VErticesi.firstarc=s; 生成结点s; 前插法建表;. 3、重复第二步。,void Creatadilist(ALGraph ,图示,7.2.2 邻接表,建立无向网络(边带权图)G的算法详解:,见下页,for(k=0;kadjVEx=j; s-info=

19、NULL;s-nextarc= G.VErticesi.firstarc;G.VErticesi.firstarc=s;. ,图示,7.2.2 邻接表,建立无向网络(边带权图)G的算法详解:,接上页,邻接表的特点,7.2.2 邻接表,(1)对于顶点多边少的图采用邻接表存储节省空间;空间复杂度O(n+e)。 (2)容易找到任一顶点的第一个邻接点。,在不同的存储结构下,实现各种操作的效率可能是不同的。所以在求解实际问题时,要根据求解问题所需操作,选择合适的存储结构。,图的存储结构总结,7.2.2 邻接表,7.1 图的定义和术语7.2 图的存储结构7.3 图的遍历7.4 图的连通性问题7.5 有向无

20、环图的应用7.6 最短路径,第七章 图,7.3.1、深度优先搜索 7.3.2、广度优先搜索,图的遍历是指:从图的某一顶点出发访问图中的所有顶点,且每个顶点仅访问一次。,7.3 图的遍历,深度优先搜索的示例演示,v1,v6,v3,v2,v4,v5,v7,v8,v9,v1,v6,v3,v2,v4,v5,v7,v8,v9,Visited9,1,1,1,1,1,1,1,1,1,7.3.1 深度优先搜索,算法的基本思想,7.3.1 深度优先搜索,(1)首先访问图中某一个顶点Vi,以该顶点为出发点; (2)任选一个与顶点Vi邻接的未被访问的顶点Vj;访问Vj; (3)以Vj为新的出发点继续进行深度优先搜索

21、,直至图中所有和Vi有路径的顶点均被访问到。,步骤: 1、访问v; 2、改变访问标志; 3、任选一个与v相邻又没被访问的顶点w,从w开始继续进行深度优先搜索。,从某点v(设v为某顶点编号)出发。,7.3.1 深度优先搜索,深度优先搜索算法概要,void DFS(Graph G, int v) / 从顶点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 /

22、DFS,7.3.1 深度优先搜索,深度优先搜索算法详解,答案:首先将图中每个顶点的访问标志设为 FALSE, 之后搜索图中每个顶点,如果未被访问,则以该顶点为起始点,进行深度优先搜索遍历,否则继续检查下一顶点。,讨论:如何实现非连通图的深度优先搜索遍历,7.3.1 深度优先搜索,void DFSTraVErse(Graph G, Status (*Visit)(int v) / 对图 G 作深度优先遍历。VisitFunc = Visit; for (v=0; vG.VExnum; +v) visitedv = FALSE; / 访问标志数组初始化for (v=0; vG.VExnum; +v

23、) if (!visitedv) DFS(G, v);/ 对尚未访问的顶点调用DFS ,7.3.1 深度优先搜索,深度优先搜索算法详解(绪),算法分析,假设图中有 n 个顶点,e 条边。如果用邻接表表示图,沿每个链可以找到某个顶点 v 的所有邻接顶点 w。由于总共有 2e 个边结点,所以扫描边的时间为O(e)。而且对所有顶点递归访问1次,所以遍历图的时间复杂性为O(n+e)。如果用邻接矩阵表示图,则查找每一个顶点的所有的边,所需时间为O(n),则遍历图中所有的顶点所需的时间为O(n2)。,7.3.1 深度优先搜索,利用深度优先搜索可以实现以下目标(1) 求深度优先生成树(2) 判断图是否连通(

24、3) 求图的连通分量,7.3.1 深度优先搜索,深度优先搜索的功能,广度优先搜索示例演示,出发点,v5,v2,v1,v3,v4,v6,v7,v8,v0,v5,v2,v1,v3,v4,v6,v7,v8,2,3,4,5,6,7,8,9,Q,Visitv,0 1 2 3 4 5 6 7 8,T,V0,V0,T,V1,T,V5,V1,T,V2,V6,T,V5,T,V4,V2,T,T,V3,V7,V6,T,V8,V3,V4,V7,V8,1,7.3.2 广度优先搜索,v0,广度优先搜索(Breadth First Search)遍历类似于树的按层次遍历。(1)首先访问图中某一个指定的出发点vi;(2)然后

25、依次访问vi的所有邻接点vi1,vi2vit;(3)再依次以vi1,vi2vit为顶点,访问各顶点未被访问的邻接点,依此类推,直到图中所有顶点均被访问为止。,广度优先搜索的思想,7.3.2 广度优先搜索,void BFSTraVErse(Graph G, Status (*Visit)(int v) for (v=0; vG.VExnum; +v)visitedv = FALSE; /初始化访问标志InitQueue(Q); / 置空的辅助队列Qfor ( v=0; vG.VExnum; +v )if ( !visitedv) / v 尚未访问 / BFSTraVErse,7.3.2 广度优先

26、搜索,广度优先搜索算法详解,见下页,visitedv = TRUE; Visit(v); / 访问u EnQueue(Q, v); / v入队列 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入队列 ,接上页,7.3.2 广度优先搜索,广度优先搜索算法详解,算法分析,如果使用邻接表表示图,则循环的总时间代价为 d0 +

27、 d1 + + dn-1 = O(e),其中的 di 是顶点 i 的度。如果使用邻接矩阵,则对于每一个被访问过的顶点,循环要检测矩阵中的 n 个元素,总的时间代价为O(n2)。,7.3.2 广度优先搜索,利用广度优先搜索可以实现以下目标(1) 求广度优先生成树(2) 判断图是否连通(3) 求图的连通分量,广度优先搜索的功能,7.3.2 广度优先搜索,7.1 图的定义和术语7.2 图的存储结构7.3 图的遍历7.4 图的连通性问题7.5 有向无环图的应用7.6 最短路径,第七章 图,7.4.1 无向图的连通分量和生成树 *7.4.2 有向图的强连通分量7.4.3 最小生成树 *7.4.4 关节点

28、和重连通分量,7.4、图的连通性问题,深度优先搜索和广度优先搜索在基于一点的搜索过程中,能访问到该顶点所在的最大连通子图的所有顶点,即一个连通分量。通过变换搜索顶点,可求得无向图的所有连通分量。,7.4.1 无向图的连通分量,连通分量求解过程,最小生成树的定义,7.4.1 最小生成树,对于边带权图(网)来说:在所有的生成树中,各边的权值(边长)总和最小的生成树称作最小生成树。,最小生成树的性质(MST性质),a,b,c,d,e,f,g,18,18,19,15,20,8,20,9,3,15,16,7.4.1 最小生成树,假设G=(V,E)是一个连通网,U是顶点集V的一个非空子集。若(u,v)是一

29、条具有最小权值(代价)的边,其中uU,vV-U,则必存在一棵包含边(u,v)的最小生成树。,如图所示:连接 两 部分的边有 (f,e), (f,d),(g,d), (c,d)其中(f,e)最 小,必然在一棵 生成树中,7.4.1 最小生成树,设G=(V,E)是连通网,用T来记录G上最小生成树边的集合。(1)算法开始时,U=1|1V(选一个初始顶点),T= ;(2)找到满足minweight(u,v)|uU,vV-U的边(ui,vi),把它并入集合T中,同时vi并入U;(3)反复执行b,直到U=V时终止算法。,最小生成树算法-普里姆(Prim)算法思想,v2,v5,v6,v4,v1,v3,6,5

30、,1,5,5,3,6,6,4,2,v2,v5,v6,v4,v1,v3,6,5,1,100,100,lowcost,0 1 2 3 4 5,adjVEx,closedgen,7.4.1 最小生成树,普里姆(Prim)算法示例演示,打印v1-v3,顶点:,lowcost,closedgen,0 1 2 3 4 5,5,v3,0,6,v3,v3,4,adjVEx,7.4.1 最小生成树,普里姆(Prim)算法示例演示,v2,v5,v6,v4,v1,v3,6,5,1,5,5,3,6,6,4,2,v2,v5,v6,v4,v1,v3,6,5,1,100,100,打印v1-v3,打印v3-v6,v2,v5,

31、v6,v4,v1,v3,5,1,4,6,5,lowcost,closedgen,0 1 2 3 4 5,2,0,v6,adjVEx,7.4.1 最小生成树,普里姆(Prim)算法示例演示,v2,v5,v6,v4,v1,v3,6,5,1,5,5,3,6,6,4,2,打印v1-v3,打印v3-v6,打印v6-v4,v2,v5,v6,v4,v1,v3,2,1,4,6,5,打印v3-v2,打印v2-v5,lowcost,closedgen,0 1 2 3 4 5,0,0,v2,3,adjVEx,7.4.1 最小生成树,普里姆(Prim)算法示例演示,v2,v5,v6,v4,v1,v3,6,5,1,5,

32、5,3,6,6,4,2,void MiniSpanTree_P(MGraph G, VErtexType u) k = LocateVEx (G, u ); for ( j=0; jG.VExnum; +j )/ 辅助数组初始化if (j!=k) closedgej = u, G.arcskj.adj ; closedgek.lowcost = 0; / 初始,Uufor (i=0; iG.VExnum; +i) ,继续向生成树上添加顶点;,7.4.1 最小生成树,普里姆(Prim)算法详解,见下页,k = minimum(closedge); / 求出加入生成树的下一个顶点(k)printf

33、(closedgek.adjVEx, G.VExsk); / 输出生成树上一条边closedgek.lowcost = 0; / 第k顶点并入U集for (j=0; jG.VExnum; +j) /修改其它顶点的最小边if (G.arcskj.adj closedgej.lowcost)closedgej = G.VExsk, G.arcskj.adj ;,7.4.1 最小生成树,普里姆(Prim)算法详解,接上页,时间复杂性主要体现在两层循环上,复杂性是O(n2),空间复杂性主要体现在两个辅助数组,复杂性是O(n),普里姆(Prim)算法分析,7.4.1 最小生成树,Kruskal算法思想,

34、7.4.1 最小生成树,设G=(V,E)是连通网,用T来记录G上最小生成树边的集合。(1)从G中取最短边e,如果边e所关联的两个顶点不在T的同一个连通分量中,则将该边加入T;(2)从G中删除边e;(3)重复(1)和(2)两个步骤,直到T中有n-1条边。,Kruskal算法示例演示,1,4,5,3,0,2,6,5,1,5,7,3,5,6,4,2,1,4,5,3,0,2,11,12,13,14,15,15,7.4.1 最小生成树,输入:连通图G=(V,E),其中V=1,2,n, 输出:一颗最小生成树: void Kruskal(V,T) T=V;ncomp=n;/连通分量while(ncomp1)

35、 从E中取出删除权最小的边(v,u);if(v和u属于T中不同的连通分量)T=T(v,u); ncomp-; ,Kruskal算法概要,7.4.1 最小生成树,7.4.1 最小生成树,Prim算法和Kruskal算法比较,7.1 图的定义和术语7.2 图的存储结构7.3 图的遍历7.4 图的连通性问题7.5 有向无环图的应用7.6 最短路径,第七章 图,7.5 有向无环图的应用,7.5.1 拓扑排序7.5.2 关键路径,问题提出,一个无环的有向图称作有向无环图,简称DAG图。DAG图在工程计划和管理方面应用广泛。几乎所有的工程(project)都可分为若干个称作“活动”的子工程, 并且这些子工

36、程之间通常受着一定条件的约束。,7.5 有向无环图的应用,某些子工程必须在另外的一些子工程完成之后才能开始。对整个工程和系统,人们主要关心的是两方面的问题:(1)工程能否顺利进行;(2) 完成整个工程所必须的最短时间。,拓扑排序,关键路径,问题提出,7.5 有向无环图的应用,7.5.1 拓扑排序,计算机专业课程次序的安排就是一个简单的工程,每一门课程的学习都是整个工程的活动。其中有些课程要求先安排,有些则不需要,如何安排好课程学习的先后次序,这是一个典型的拓扑排序问题。,拓扑排序事例分析,编号 课程名称 先修课程 1 计算机原理 82 编译原理 4,53 操作系统 4,54 程序设计 无5 数

37、据结构 4,66 离散数学 97 形式语言 68 电路基础 99 高等数学 无10 计算机网络 1,7.5.1 拓扑排序,拓扑排序事例分析,9,4,6,5,2,3,8,1,7,10,编号 先修课程编号 1 8 2 4,5 3 4,5 4 无 5 4,6 6 9 7 6 8 9 9 无 10 1,7.5.1 拓扑排序,生成DAG图,拓扑排序事例分析,顶点活动网(AOV网) :将顶点表示活动,边表示活动之间的关系的网称为顶点活动网。,拓扑序列:把AOV网中的所有顶点排成一个线性序列,该序列满足如下条件:若AOV网中存在从vi到vj的路径,则在该序列中,vi必位于vj之前。,拓扑排序有关概念,7.5

38、.1 拓扑排序,拓扑排序:构造AOV网的拓扑序列的操作被称为拓扑排序。,(1)一个有向图的拓扑序列不一定唯一; (2)有向无环图一定存在拓扑序列; (3)有向有环图不存在拓扑序列; (4)通过构造拓扑序列,可判定AOV网是否存在环。,拓扑排序特点,7.5.1 拓扑排序,拓扑排序算法的基本思想,7.5.1 拓扑排序,(1)在有向图中选一个入度为0的顶点输出。 (2)从图中删除该顶点及所有它的出边。 (3)重复执行a和b,直到全部顶点均已输出,或图中剩余顶点的入度均不为0(说明图中存在回路,无法继续拓扑排序)。,1,2,3,8,9,7,5,6,4,1,2,3,8,9,7,5,6,4,拓扑排序算法的

39、示例演示,7.5.1 拓扑排序,讨论:如果顶点还没有输出完而找不到入度为零的顶点怎么办?,答案:存在环路,无法进行拓扑排序,退出。,indegree,栈,v1,v6,v4,v3,2,1,1,0,0,7.5.1 拓扑排序,拓扑排序算法演示,增加一个存放各顶点入度的数组indegree (1)扫描indegree,将入度为零的顶点入栈; (2)while(栈非空)弹出栈顶元素vi并输出;检查vi的出边表,将每条出边的终点vj的入度减1,若vj的入度减至0,则vj入栈; (3)若输出的顶点数小n,则“有回路”;否则正常结束。,7.5.1 拓扑排序,拓扑排序算法概要,void FindInDegree

40、(ALGraph G, int indegree) int i; ArcNode *p;for (i=0;iadjvex+;p=p-next; ,7.5.1 拓扑排序,求各顶点入度的算法详解,Status TopologicalSort(ALGraph G) SqStack S; int count,k,i; ArcNode *p;int indegreeMAX_VERTEX_NUM;FindInDegree(G, indegree); / 对各顶点求入度InitStack(S);for (i=0; iG.VExnum; +i) / 建零入度顶点栈Sif (!indegreei) Push(S

41、, i);/ 入度为0者进栈count = 0;/ 对输出顶点计数,7.5.1 拓扑排序,拓扑排序算法详解,见下页,while (!StackEmpty(S) Pop(S, i); printf(i, G.VErticesi.data); +count; for (p=G.VErticesi.firstarc; p; p=p-nextarc) k = p-adjVEx; if (!(-indegreek) Push(S, k); if (countG.VExnum) return ERROR; else return OK; / TopologicalSort,接上页,7.5.1 拓扑排序,拓

42、扑排序算法详解,算法分析,设AOV网有n个顶点,e条边。初始建立入度为0 的顶点栈,要检查所有顶点一次,执行时间为O(n);排序中,若AOV网无回路,则每个顶点入、出栈各一次,每个边表结点被检查一次,执行时间为O(n+e);拓扑排序算法的时间复杂度为O(n+e)。,7.5.1 拓扑排序,AOE网:带权的有向图,顶点表示事件,边表示活动,权表示活动持续的时间。,7.5.2 关键路径,关键路径的有关概念,AOE网的特点(1)表示实际工程计划的AOE网应该是无回路的;(2)只有一个入度为零的顶点(称作源点),表示整个活动开始;(3)只有一个出度为零的顶点(称作汇点)表示整个活动结束。,v1,v2,V

43、3,v8,v9,v6,20,12,10,15,10,12,v4,v5,20,v7,2,2,2,12,7.5.2 关键路径,AOE网图示,源点,汇点,讨论: (1)整个工程需要多少时间? (2)哪些活动是影响工程进度的关键?,v1,v2,V3,v8,v9,v6,20,12,10,15,10,12,v4,v5,20,v7,2,2,2,12,7.5.2 关键路径,AOE网图示,源点,汇点,答案:最短时间是从源点到汇点的最长路径长度。最长路径上的活动是影响工程进度的关键。,在AOE 网中,有些活动可以同时进行,完成一个工程所需的最短时间是从源点到汇点的最长路径长度。长度最长的路径称为关键路径。,7.5

44、.2 关键路径,关键路径,关键路径上的活动都是关键活动。,关键活动,v1,v2,V3,v8,v9,v6,20,12,10,15,10,12,v4,v5,20,v7,2,2,2,12,7.5.2 关键路径,讨论:关键活动延长是否必然影响工期?关键活动缩短是否必然缩短工期?,结论:关键活动延长必然影响工期?关键活动缩短不一定能缩短工期?,事件vi的最早发生时间是从源点v1到vi的最长路径长度,记作ve(i)。 事件vk的最迟发生时间是vn的最早发生时间ve(n)减去vk到vn的最长路径长度,记作 vl(k)。,7.5.2 关键路径,v1,v2,V3,v8,v9,v6,20,12,10,15,10,

45、12,v4,v5,20,v7,2,2,2,12,事件的最早发生时间与最迟发生时间,活动的最早开始时间是vi的最早开始时间,记作e(i)。 活动的最迟开始时间是vj的最迟开始时间减去的持续时间,记作l(i) 。,7.5.2 关键路径,v1,v2,V3,v8,v9,v6,20,12,10,15,10,12,v4,v5,20,v7,2,2,2,12,活动的最早发生时间与最迟发生时间,7.5.2 关键路径,v1,v2,V3,v8,v9,v6,20,12,10,15,10,12,v4,v5,20,v7,2,2,2,12,活动的最早发生时间与最迟发生时间的性质,最早发生时间与最迟发生时间相等的活动为关键活动。 我们的目的就是要找出关键活动,为缩短工期提供帮助。,(1)求出每个事件i的最早发生时间ve(i)和vl(i) (2)设活动ai所对应的边为,dut()表示其持续时间,用如下公式计算活动ai的最早发生时间e(i)和最迟发生时间l(i): e(i)=vej l(i)=vlk-dut(),7.5.2 关键路径,求关键活动算法要点,

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

当前位置:首页 > 高等教育 > 大学课件

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


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

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

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