




已阅读5页,还剩110页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第9章图,图的基本概念图的存储结构图的实现图的遍历最小生成树最短路径拓扑排序关键路径,主要知识点,教学计划编排问题一个教学计划包含许多课程,在教学计划包含的许多课程之间,有些课程之间有先修和后续的关系,有些课程可以任意安排次序。,教学计划编排问题(图形结构)各课程之间的次序关系可用一个称作图的数据结构来表示,如课程之间优先关系有向图。有向图中的每个顶点表示一门课程,如果从顶点vi到vj之间存在有向边,则表示课程i必须先于课程j进行。,课程之间优先关系的有向图,9.1图,1.图的基本概念,图是由顶点集合及顶点间的关系集合组成的一种数据结构。图G的定义是:G=(V,E),其中,V=x|x某个数据元素集合E=(x,y)|x,yV或E=x,y|x,yV并且Path(x,y)其中,(x,y)表示从x到y的一条双向通路,即(x,y)是无方向的;Path(x,y)表示从x到y的一条单向通路,即Path(x,y)是有方向的。问题:图的特点,图有许多复杂结构,本课程只讨论最基本的图,因此,本章讨论的图中不包括存在从自身到自身的边的图,以及多条边的图,带自身环的图,多重图,基本术语:,(1)顶点和边:图中的结点一般称作顶点,图中的第i个顶点记做vi。两个顶点vi和vj相关联称作顶点vi和vj之间有一条边,图中的第k条边记做ek,ek=(vi,vj)或vi,vj。,(2)有向图和无向图:在有向图中,顶点对x,y是有序的,顶点对x,y称为从顶点x到顶点y的一条有向边,有向图中的边也称作弧;在无向图中,顶点对(x,y)是无序的,顶点对(x,y)称为与顶点x和顶点y相关联的一条边。,(3)完全图:在有n个顶点的无向图中,若有n(n-1)/2条边,即任意两个顶点之间有且只有一条边,则称此图为无向完全图;在有n个顶点的有向图中,若有n(n-1)条边,即任意两个顶点之间有且只有方向相反的两条边,则称此图为有向完全图,无向完全图,不是无向完全图,有向完全图,不是有向完全图,(4)邻接顶点:在无向图G中,若(u,v)是E(G)中的一条边,则称u和v互为邻接顶点,并称边(u,v)依附于顶点u和v;在有向图G中,若u,v是E(G)中的一条边,则称顶点u邻接到顶点v,顶点v邻接自顶点u,并称边u,v和顶点u和顶点v相关联。,(5)顶点的度:顶点v的度是与它相关联的边的条数,记作TD(v)。有向图:顶点的度=入度+出度。入度ID(v)定义为以顶点v为终点的有向边的条数;出度OD(v)定义为以顶点v为起点的有向边的条数;无向图:TD(v)=ID(v)=OD(v),(6)路径:在图G=(V,E)中,若从顶点vi出发有一组边使可到达顶点vj,则称顶点vi到顶点vj的顶点序列为从顶点vi到顶点vj的路径.,从顶点0到顶点3的路径?如图G1中:,顶点3,顶点0,顶点2,顶点0,顶点3,(7)权:有些图的边附带有数据信息,这些附带的数据信息称为权。带权的图也称作网络或网。,(8)路径长度:对于不带权的图,一条路径的路径长度是指该路径上的边的条数;对于带权的图,一条路径的路径长度是指该路径上各个边权值的总和。,(9)子图:设有图G1=V1,E1和图G2=V2,E2,若V1V2,且E1E2,则称图G2是图G1的子图。,图G2,图G1,(10)连通图和强连通图:在无向图中,若从顶点vi到顶点vj有路径,则称顶点vi和顶点vj是连通的。如果图中任意一对顶点都是连通的,则称该图是连通图。在有向图中,若对于任意一对顶点vi和顶点vj(vivj)都存在路径,则称图G是强连通图。,不是强连通图,强连通图,连通图,(11)生成树:一个连通图的最小连通子图称作该图的生成树。有n个顶点的连通图的生成树有n个顶点和n-1条边。生成树一般是对无向图来讨论。,图G2的生成树,(12)简单路径和回路:若路径上各顶点v1,v2,vm,互不重复,则称这样的路径为简单路径;若路径上第一个顶点v1与最后一个顶点vm重合,则称这样的路径为回路或环。,数据集合:由一组顶点集合vi和一组边ej集合组成。当为带权图时每条边上权wj还构成权集合wj。操作集合:(1)初始化Initiate(G,n)(2)插入顶点InsertVertex(G,vertex)(3)插入边InsertEdgeG,v1,v2,weight)(4)删除边DeleteEdge(G,v1,v2)(5)删除顶点DeleteVertex(G,vertex)(6)取第一个邻接顶点GetFirstVex(G,v)(7)取下一个邻接顶点GetNextVex(G,intv1,v2)(8)遍历DepthFirstSearch(G),2.图的抽象数据类型,9.2图的存储结构,图的存储结构主要有邻接矩阵和邻接表两种。,1.图的邻接矩阵存储结构,假设图G=(V,E)有n个顶点,即V=v0,v1,vn-1,E可用如下形式的矩阵A描述,对于A中的每一个元素aij,满足:,由于矩阵A中的元素aij表示了顶点vi和顶点vj之间边的关系,或者说,A中的元素aij表示了顶点vi和顶点vj(0jn-1)的邻接关系,所以矩阵A称作邻接矩阵。,无向图的邻接矩阵一定是对称矩阵,有向图的邻接矩阵一般是非对称矩阵,其中V表示了图的顶点集合,A表示了图的邻接矩阵,对于带权图,邻接矩阵定义为:,带权图及其邻接矩阵,其中V表示了图的顶点集合,A表示了图的邻接矩阵。对于带权图,邻接矩阵第i行中所有0aij的元素个数等于第i个顶点的出度,邻接矩阵第j列中所有0edgev1v2=weight;G-numOfEdges+;,插入边操作,v1=G-Vertices.size|v2=G-Vertices.size,voidDeleteEdge(AdjMWGraph*G,intv1,intv2)if(v1=G-Vertices.size|v2=G-Vertices.size|v1=v2)printf(参数v1或v2越界出错!n);exit(1);if(_)printf(该边不存在!n);exit(0);G-edgev1v2=MaxWeight;G-numOfEdges-;,删除边操作,G-edgev1v2=MaxWeight|v1=v2,intGetFirstVex(AdjMGraphG,intv)intcol;if(vG.Vertices.size)printf(参数v1越界出错!n);exit(1);for(col=0;col0,取第一个邻接顶点,大于0并且小于MaxWeight?,intGetNextVex(AdjMGraphG,intv1,intv2)intcol;if(v1=G.Vertices.size|v2=G.Vertices.size)printf(参数v1或v2越界出错!n);exit(1);for(col=v2+1;col0,大于0并且小于MaxWeight?,取下一个邻接顶点,2.邻接矩阵图操作的测试,例9-1以下图所示的带权有向图为例编写测试邻接矩阵图的程序。,边的权值,边的起点,边的终点,顶点存储在一个字符数组中,边信息存储在一个结构数组中,图的创建函数设计如下:边信息结构体定义typedefstructintrow;/行下标intcol;/列下标intweight;/权值RowColWeight;,创建该图,对一个AdjMGraph类型的结构变量插入顶点和边,voidCreatGraph(AdjMGraph*G,DataTypeV,intn,RowColWeightE,inte)/*在图G中插入n个顶点信息V和e条边信息E*/inti,k;Initiate(G,n);/*初始化n个顶点的图*/for(i=0;in;i+)InsertVertex(G,Vi);/*顶点插入*/for(k=0;ke;k+)InsertEdge(G,Ek.row,Ek.col,Ek.weight);/*边插入*/,图的创建函数,图存放的AdjMGraph类型的指针变量,顶点和顶点数,边信息和边数,测试程序设计如下:#include#includetypedefcharDataType;#defineMaxSize100#defineMaxVertices10#defineMaxEdges100#defineMaxWeight10000#includeAdjMGraph.h#includeAdjMGraphCreate.h,voidmain(void)AdjMWGraphg1;DataTypea=A,B,C,D,E;RowColWeightrcw=0,1,10,0,4,20,1,3,30,2,1,40,3,2,50;intn=5,e=5;inti,j;CreatGraph(,2.邻接表存储结构下图操作的实现,三个成员:data,source,单链表头指针adj,两个成员:下标dest,下一个结点指针next,2.邻接表存储结构下图操作的实现,邻接表的存储结构typedefstructNodeintdest;/*邻接边的弧头顶点序号*/structNode*next;Edge;/*邻接边单链表的结点结构体*/typedefstructDataTypedata;/*顶点数据元素*/intsorce;/*邻接边的弧尾顶点序号*/Edge*adj;/*邻接边的头指针*/AdjLHeight;/*数组的数据元素类型结构体*/,typedefstructAdjLHeightaMaxVertices;/*邻接表数组*/intnumOfVerts;/*顶点个数*/intnumOfEdges;/*边个数*/AdjLGraph;/*邻接表结构体*/讨论:图操作的实现方法,一个邻接表用一个AdjLGragph类型的指针变量表示,定义语句为:AdjLGraph*G;,0,1,2,i,MaxVertices,3.插入第i个顶点,i?,AdjLGraph*G,ai,data,0,1,2,v1,MaxVertices,4.插入边,v1,v2是否在numOfVerts范围内?,已知顶点v1和v2,adj,p,v2,修改边数,0,1,2,v1,MaxVertices,5.删除边,v1,v2是否在numOfVerts范围内?,已知顶点v1和v2,adj,查找v2?,curr,只要curr存在且其dest值!=v2则curr下移一个,一般需要记录curr的前一个,引入pre,curr,pre,找完,分为三种情况.在第一个.不是第一个.其他,0,1,2,v,MaxVertices,6.取第一个邻接顶点,v是否在numOfVerts范围内?,已知顶点v,adj,邻接表存储结构下的图的定义和操作测试参见具体程序:GraphTest.c,9.4图的遍历,1.图的深度和广度优先遍历算法,图的遍历是访问图中的每一个顶点且每个顶点只被访问一次.图遍历方法深度优先遍历广度优先遍历算法设计需要考虑三个问题:算法的参数要指定访问的第一个顶点;要考虑遍历路径可能出现的死循环问题;要使一个顶点的所有邻接顶点按照某种次序被访问。,一、图的深度优先遍历算法,图的深度优先遍历算法是遍历时深度优先的算法;图的深度优先遍历是指在图的所有邻接顶点中,每次都在访问完当前顶点之后,接着首先访问当前顶点的第一个邻接顶点。图的深度优先遍历算法是一个函数递归调用算法。,开始,选择初始顶点v,0,取v的第一个邻接顶点w,w访问?,取v的邻接顶点w的下一个邻接顶点w,结束,0,w存在否,按深度优先遍历访问w,1,访问和标记v已访问,连通图的深度优先遍历算法为:,对于例9-8所示的有向图,顶点A作为初始访问结点,深度优先遍历访问顶点次序为:ABDCE,同一个路径顶点优先,二、图的广度优先遍历算法,图的广度优先遍历算法是一个分层搜索的过程,需要一个队列以保持访问过的顶点的顺序,以便按访问过的顶点的顺序来访问这些顶点的邻接顶点。连通图的广度优先遍历算法为:,图的广度优先遍历是指从指定的顶点开始,按照到该顶点路径长度由短到长的顺序,依次访问图中的其余顶点。,开始,选择初始顶点v,顶点入队列Q,Q的队头元素u出队,Q空否,0,寻找u的第一个邻接顶点w,w访问?,取u的邻接顶点w的下一个邻接顶点w,1,结束,0,w存在否,访问和标记w已访问,0,1,访问和标记v已访问,对于例9-8所示的有向图,顶点A作为初始访问结点,广度优先遍历访问顶点次序为:ABEDC问题:图的(深度、广度)遍历和生成树的关系?,同一个顶点的邻接顶点优先,三、非连通图的遍历,对于非连通图,从图的任意一个顶点开始深度或广度优先遍历并不能访问图中的所有顶点。只能访问和初始顶点连通的所有顶点。但是,每一个顶点都作为一次初始顶点进行深度优先遍历或广度优先遍历,并根据顶点的访问标记来判断是否需要访问该顶点,就一定可以访问非连通图中的所有顶点。,voidDepthFSearch(AdjMWGraphG,intv,intvisited,voidVisit(DataTypeitem)intw;Visit(G.Vertices.listv);visitedv=1;w=GetFirstVex(G,v);while(w!=-1)if(!visitedw)DepthFSearch(G,w,visited,Visit);w=GetNextVex(G,v,w);,2.图的深度和广度优先遍历函数实现,一、连通图深度优先遍历,二、非连通图的深度优先遍历,voidDepthFirstSearch(AdjMWGraphG,voidVisit(DataTypeitem)inti;int*visited=(int*)malloc(sizeof(int)*G.Vertices.size);for(i=0;iG.Vertices.size;i+)visitedi=0;for(i=0;iG.Vertices.size;i+)if(!visitedi)DepthFSearch(G,i,visited,Visit);free(visited);,思想:对图中每一个顶点作为初始顶点进行深度优先遍历,为了避免访问过的顶点重新被访问,引入标记指针,对图中顶点进行循环,三、连通图的广度优先遍历,#includeSeqQueue.hvoidBroadFSearch(AdjMWGraphG,intv,intvisited,voidVisit(DataTypeitem)DataTypeu,w;SeqCQueuequeue;Visit(G.Vertices.listv);visitedv=1;QueueInitiate(,voidBroadFirstSearch(AdjMWGraphG,voidVisit(DataTypeitem)inti;int*visited=(int*)malloc(sizeof(int)*G.Vertices.size);for(i=0;iG.Vertices.size;i+)visitedi=0;for(i=0;iG.Vertices.size;i+)if(!visitedi)BroadFSearch(G,i,visited,Visit);free(visited);,四、非连通图的广度优先遍历,五、程序举例例9-2以图9-8所示的带权有向图为例,编写测试上述图的深度优先和广度优先遍历函数的程序。#include#include#includetypedefcharDataType;#defineMaxSize100#defineMaxVertices10#defineMaxEdges100,#defineMaxWeight10000#defineMaxQueueSize100#includeAdjMGraph.h#includeAdjMGraphCreate.h#includeAdjMGraphTraverse.hvoidVisit(DataTypeitem)printf(%c,item);,voidmain(void)AdjMWGraphg1;DataTypea=A,B,C,D,E;RowColWeightrcw=0,1,10,0,4,20,1,3,30,2,1,40,3,2,50;intn=5,e=5;CreatGraph(,9.5最小生成树,1.基本概念,一个有n个顶点的连通图的生成树是原图的极小连通子图,它包含原图中的所有n个顶点,并且有保持图连通的最少的边。,(1)若在生成树中删除一条边就会使该生成树因变成非连通图而不再满足生成树的定义;(2)若在生成树中增加一条边就会使该生成树中因存在回路而不再满足生成树的定义;(3)一个连通图的生成树可能有许多;(4)有n个顶点的无向连通图,无论它的生成树的形状如何,一定有且只有n-1条边。,无向图和它的不同的生成树,如果无向连通图是一个带权图,那么它的所有生成树中必有一棵边的权值总和最小的生成树,我们称这棵生成树为最小代价生成树,简称最小生成树。,构造有n个顶点的无向连通带权图的最小生成树必须满足以下三条:(1)构造的最小生成树必须包括n个顶点;(2)构造的最小生成树中有且只有n-1条边;(3)构造的最小生成树中不存在回路。,典型的构造方法有两种,一种称作普里姆(Prim)算法,另一种称作克鲁斯卡尔(Kruskal)算法。,2.普里姆算法,一、算法思想,假设G=(V,E)为一个带权图,V为带权图中顶点的集合,E为带权图中边的权值集合。设置两个新的集合U和T,U用于存放带权图G的最小生成树的顶点的集合,T用于存放带权图G的最小生成树的权值的集合。,普里姆算法思想是:(1)令集合U的初值为U=u0,集合T的初值为T=。(2)从所有顶点uU和顶点vV-U的带权边中选出具有最小权值的边(u,v),将顶点v加入集合U中,将边(u,v)加入集合T中。(3)判断U=V是否成立不成立重复(2)成立时,最小生成树构造完毕。,假设构造最小生成树时从顶点u0开始,结论:最终集合U中存放着最小生成树顶点的集合,集合T中存放着最小生成树边的权值集合。,图9-10普里姆算法构造最小生成树的过程,U=A,V-U=B,C,D,E,F,G,T=50,U=A,B,V-U=C,D,E,F,G,更新,T=50,40,U=A,B,E,V-U=C,D,F,G,更新,T=50,40,50,T=,40,50,50,U=A,B,E,D,V-U=C,F,G,更新,T=50,40,50,30,30,U=A,B,E,D,F,V-U=C,G,更新,T=50,40,50,30,42,42,U=A,B,E,D,F,G,V-U=C,更新,T=50,40,50,30,42,45,45,U=A,B,E,D,F,G,C,V-U=,更新,U=A,V-U=B,C,D,E,F,G,T=,初始状态:,0,1,2,4,6,3,5,最小生成树,A,第1步:在U和V-U的顶点之间选择权值最小的边对应的顶点。,0,60,50,B,50,U=A,B,V-U=C,D,E,F,G,更新,T=50,-1,0,1,2,4,6,3,5,最小生成树,A,第2步:在U和V-U的顶点之间选择权值最小的边对应的顶点。,-1,60,50,B,50,U=A,B,V-U=C,D,E,F,G,第1步更新后,T=50,-1,预处理:引入一个一维数组lowcost。,lowcost,lowcost初值为第1行权值,第1个改为-1,在第1步更新后对Lowcost进行更新,对更新的顶点对应的邻接矩阵中的行元素从第1元素开始与lowcost中的元素进行比较,用小的替换lowcost中的值,65,40,E,40,二、普里姆函数设计,普里姆函数应有两个参数,一个参数是图G,另一个参数是通过函数得到的最小生成树的顶点数据和相应顶点的边的权值数据closeVertex。其数据类型定义为如下结构体:typederstructVerTvertex;intweight;MinSpanTree;其中,vertex域用来保存最小生成树每条边的弧头顶点数据,weight域用来保存最小生成树的相应边的权值。,图G,图G的最小生成树可以用MinSpanTree类型的结构数组和结构指针变量表示,普里姆算法可以用一个函数来实现,普里姆函数设计:voidPrim(AdjMWGraphG,MinSpanTreecloseVertex)VerTx;intn=G.Vertices.size,minCost;int*lowCost=(int*)malloc(sizeof(int)*n);inti,j,k;for(i=1;idu+d(u,y),则用du+d(u,y)替换distzncey,y,狄克斯特拉算法求从顶点A到其余各顶点最短路径的过程,二、狄克斯特拉函数设计,参数设计:函数共有4个参数,其中2个为输入参数,分别为带权图G和源点序号v0;2个为输出参数,分别为distance和path,distance用来存放得到的从源点v0到其余各顶点的最短距离数值,path用来存放得到的从源点v0到其余各顶点的最短路径上到达目标顶点的前一顶点下标。,狄克斯特拉函数设计:voidDijkstra(AdjMGraphG,intv0,intdistance,intpath)/*带权图G从下标v0顶点到其它顶点的最短距离distance*/*和最短路径下标path*/intn=G.Vertices.size;int*s=(int*)malloc(sizeof(int)*n);intminDis,i,j,u;/*初始化*/for(i=0;in;i+)distancei=G.edgev0i;si=0;if(i!=v0,/*在还未找到最短路径的顶点集中选有最短距离的顶点u*/for(i=1;in;i+)minDis=MaxWeight;for(j=0;j=n;j+)if(sj=0,三、测试程序例9-4:以图9-13的有向带权图为例设计测试上述Dijkstra函数的程序。,3.每对顶点之间的最短路径,带权有向图,每对顶点之间的最短路径可通过调用狄克斯特拉算法实现。具体方法是:每次以不同的顶点作为源点,调用狄克斯特拉算法求出从该源点到其余顶点的最短路径。重复n次就可求出每对顶点之间的最短路径。由于狄克斯特拉算法的时间复杂度为O(n2),所以这种算法的时间复杂度为O(n3)。,弗洛伊德算法的思想是:设矩阵cost用来存放带权有向图G的权值,即矩阵元素costij中存放着下标为i的顶点到下标为j的顶点之间的权值,可以通过递推构造一个矩阵序列A0,A1,A2,AN来求每对顶点之间的最短路径。其中,Akij(0kn)表示从顶点vi到顶点vj的路径上所经过的顶点下标不大于k的最短路径长度。初始时有,A0ij=costij。,一种情况是该路径不经过下标为k+1的顶点,此时该路径长度与从顶点vi到顶点vj的路径上所经过的顶点下标不大于k的最短路径长度相同;,另一种情况是该路径经过下标为k+1的顶点,此时该路径可分为两段,一段是从顶点vi到顶点vk+1的最短路径,另一段是从顶点vk+1到顶点vj的最短路径,此时的最短路径长度等于这两段最短路径长度之和。,当已经求出Ak,要递推求解Ak+1时,有:,这两种情况中的路径长度较小者,就是要求的从顶点vi到顶点vj的路径上所经过的顶点下标不大于k+1的最短路径长度。,用公式描述为:A0ij=costijAk+1ij=minAkij,Akik+1+Akk+1j(0kn-1),9.7拓扑排序,1偏序关系和全序关系拓扑排序就是要由某个集合上的偏序关系得到该集合上的全序关系。若集合X上的关系R是自反的、反对称的和传递的,则称关系R是集合X上的偏序关系(或称半序关系)。设关系R为定义在集合X上的二元关系,若对于每一个xX,都有(x,x)R,则称R是自反的。设关系R为定义在集合X上的二元关系,如果对于任意的x,y,zX,若当(x,y)R且(y,z)R时,有(x,z)R,则称关系R是传递的。,设关系R为定义在集合X上的二元关系,若对于所有的x,yX,若当(x,y)R且(y,x)R时,有x=y,则称关系R是反对称的。例如,设X是实数集合,R为小于等于关系,即R=(x,y)|xXyXxy,由于当xy且yx时有xy,因此,关系R是反对称关系。另外,相等关系也是反对称关系。设关系R是集合X上的偏序关系,若对所有的x,yX,有(x,y)R或(y,x)R,则称关系R是集合X上的全序关系。偏序关系的实质是在集合X的元素之间建立层次结构。这种层次结构是依赖于偏序关系的可比性建立起来的。但是,偏序关系不能保证集合X中的任意两个元素之间都能比较。而全序关系可以保证集合中的任意两个元素之间都可以比较。,2有向图在实际问题中的应用一个有向图可以表示一个施工流程图,或产品生产流程图,或数据流图等。设图中每一条有向边表示两个子工程之间的先后次序关系。若以有向图中的顶点来表示活动,以有向边来表示活动之间的先后次序关系,则这样的有向图称为顶点表示活动的网(ActivityOnVertexNetwork),简称AOV网。AOV网表示的有向图要解决的一个问题,就是如何得到一个完成整个工程项目的各子工程的序列。这就是有向图的拓扑排序问题。,3拓扑排序在有向图中的应用如果把有向图中的所有顶点看作集合中的元素,把有向图中的有向边看作集合中的关系(通常情况下是先于关系),则可以证明,如果有向图中不存在回路,则对应的集合上的关系满足偏序关系。因此,如何得到AOV网表示的施工流程图的一个完成整个工程项目的各子工程的序列问题,就是一个AOV网表示的有向图的拓扑排序问题。对一个有向图进行拓扑排序,就是将有向图中的所有顶点排成一个线性序列,使得对有向图中任意一对顶点u和v,若是有向图中的一条有向边,则顶点u在该线性序列中出现在顶点v之前。这样的线性序列称为满足拓扑次序的序列,简称为拓扑序列。对有向图建立拓扑序列的过程称为对有向图的拓扑排序。,对于AOV网的拓扑排序就是将AOV网中的所有顶点排成一个线性序列。拓扑排序实际上就是要由某个集合上的一个偏序关系得到该集合上的一个全序关系。,例如,下图所示的两个有向图,由于左图中顶点B无法和顶点C比较,所以左图表示的是偏序关系。如果在左图中人为添加一条顶点B到顶点C的有向边,即右图,则右图表示的就是全序关系。如果我们对一个有向图进行拓扑排序,得到了该有向图中所有顶点的一个线性序列,因线性序列中所有顶点均可以比较,也就相当于通过人为添加一些有向边,把有向图对应的偏序关系变成了全序关系。,4有向图的拓扑排序算法有向图的拓扑排序算法:(1)在有向图中选择一个没有前驱的顶点,并把它输出;(2)从有向图中删去该顶点以及与它相关的有向边。重复上述两个步骤,直到所有顶点都输出,或者剩余的顶点中找不到没有前驱的顶点。在前一种情况下,顶点的输出序列就是一个拓扑序列;后一种情况则说明有向图中存在回路,如果有向图中存在回路,则该有向图一定无法得到一个拓扑序列。,上述算法仅能得到有向图的一个拓扑序列。改进上述算法,可以得到有向图的所有拓扑序列。如果一个有向图存在一个拓扑序列,通常表示该有向图对应的某个施工流程图的一种施工方案切实可行;而如果一个有向图不存在一个拓扑序列,则说明该有向图对应的某个施工流程图存在设计问题,不存在切实可行的任何一种施工方案。,例:对于如下图所示的AOV网,写出利用拓扑排序算法得到的一个拓扑序列。解:根据拓扑排序算法,得到的一个拓扑序列为0,1,7,2,4,8,5,9,3,6。,9.8关键路径,1工程管理中的问题在工程规划中,经常需要考虑这样的问题,完成整个工程最短需要多长时间,工程中的哪些工序是一些重要的工序,缩短这些重要工序的时间可以缩短整个工程的工期。在生产管理中,也存在这样的问题,一件产品有多道生产工序,减少哪道工序所用的时间可以缩短产品的生产周期。诸如此类的问题,可以使用有向图进行描述和分析。下面我们首先给出描述这类问题的有关概念,然后讨论解决的方法。,2AOE网对工程管理问题的表示在有向图中,如果顶点表示事件,有向边表示活动,有向边上的权值表示活动持续的时间,这样的有向图称为边表示活动的网(ActivityOnEdge),简称AOE网。对于AOE网,需要研究的问题是:(1)完成整个工程需要多少时间?(2)哪些活动是影响工程进度的关键?,a9=6,a6=4,a2=7,a1=5,a3=3,a4=6,a5=3,a7=5,a8=4,a10=5,a11=8,a14=9,a12=2,a13=8,a15=3,图9-19AOE网,基本概念:路径长度:AOE网的一条路径上所有活动的总和称为该路径的长度。关键路径:在AOE网中,从源点到汇点的所有路径中,具有最大路径长度的路径称为关键路径。关键活动:关键路径上的活动称为关键活动。显然,完成整个工程的最短时间就是AOE网中关键路径的长度,也就是AOE网中各关键活动所持续时间的总和。例:找出前图所示的AOE网中的关键路径。解:在AOE网中,从源点v0到汇点v9共有13条路径,分别计算这13条路径的长度,得到最大路径长度为31。最大路径长度对应的关键路径为(v0,v2,v3,v4,v6,v9)和(v0,v2,v3,v4,v7,v9)。,3几个参数的定义活动的持续时间dut():对于有向边代表的活动,dut()是该有向边的权值。事件可能的最早开始时间e(k):对于顶点k代表的事件,e(k)是从源点到该顶点的最大路径长度。在一个有n+1个事件的AOE网中,源点0的最早开始时间e(0)等于0。事件k(k=1,2,3,n)可能的最早开始时间e(k)可用递推公式表示为:,活动可能的最早开始时间e(i):对于有向边ai代表的活动,e(i)是该活动的弧尾事件可能的最早发生时间。假设活动ai代表的是有向边,即ai是关联事件j和事件k的的活动,则e(i)=e(j)。活动允许的最晚开始时间l(i):对于有向边ai代表的活动,l(i)是该活动的弧头事件允许的最晚发生时间减去该活动持续的时间。l(i)是在不推迟整个工程完成的前提下,活动ai必须开始的时间
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 大学毕业论文(设计)致谢9篇
- 2025年企业管理资料金融企业劳动合同示范文文档范本
- 毕业论文(设计)致谢9篇
- 2025年金融机构外汇流动资金借款合同范本
- 《2025全面的新员工个人劳动合同模板集》
- 一、启动Excel建立新工作簿教学设计-2025-2026学年初中信息技术沪科版八年级上册-沪科版
- 预应力工程施工进度动态管控方案
- 防腐保温层后期维护与修补技术方案
- 天然气管道试压技术实施方案
- 重庆市九龙坡区招聘社区工作者考试真题2024
- 2025入党考试试题及答案
- 即时检验在急重症的应用管理专家共识(2024)解读
- 教科版五年级上册科学教学计划附进度表
- 红色国潮风汉宫春晓图宣传介绍教育课件
- 燃气轮机原理课件
- 老年患者体位护理
- 2025新译林版英语八上单词默写表(先鸟版)
- 非晶合金变压器制造的改建及纳米晶超薄带和非晶粉末的研发项目环评资料环境影响
- 2025年执业医师考试临床技能试题及答案
- 洽谈互赔协议书
- 大学生安全教育课件
评论
0/150
提交评论