数据结构简明教程(第3版)课件 第7章图(下)_第1页
数据结构简明教程(第3版)课件 第7章图(下)_第2页
数据结构简明教程(第3版)课件 第7章图(下)_第3页
数据结构简明教程(第3版)课件 第7章图(下)_第4页
数据结构简明教程(第3版)课件 第7章图(下)_第5页
已阅读5页,还剩69页未读 继续免费阅读

下载本文档

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

文档简介

第7章图7.1图的基本概念7.2图的存储结构7.3图的遍历7.4生成树和最小生成树7.5最短路径7.6拓扑排序7.7AOE网与关键路径第7章图1/747.4生成树和最小生成树在一个无向连通图G中,如果取它的全部顶点和一部分边构成一个子图G',即V(G')=V(G)和E(G')

E(G)。若边集E(G')中的边既将图G中的所有顶点连通又不形成回路,则称子图G'是原图G的一棵生成树。7.4.1什么是图的生成树和最小生成树7.4生成树和最小生成树2/74通过深度优先遍历产生的生成树称为深度优先生成树。通过广度优先遍历产生的生成树称为广度优先生成树。7.4生成树和最小生成树可以通过遍历方式产生一个无向图的生成树。3/74连通图:仅需要从图中任一顶点出发,进行深度优先遍历或广度优先遍历便可以访问到图中所有顶点,因此连通图的一次遍历所经过的边的集合及图中所有顶点的集合就构成了该图的一棵生成树。非连通图:它由多个连通分量构成的,则需要从每个连通分量的任一顶点出发进行遍历,每次从一个新起点出发进行遍历过程得到的顶点访问序列恰为各个连通分量中的顶点集。每个连通分量产生的生成树合起来构成整个非连通图的生成树。

7.4生成树和最小生成树无向图进行遍历时:4/74由一个带权无向图可能产生多棵生成树,把具有权之和最小的生成树称为图的最小生成树(MinimumCostSpanningTree,简称MCST)。构造一个图的最小生成树主要有两个算法,即普里姆算法和克鲁斯卡尔算法。7.4生成树和最小生成树5/747.4.2普里姆算法普里姆(Prim)算法是一种构造性算法。G=(V,E)

T=(U,TE)是G的从顶点v出发构造的最小生成树,步骤如下:(1)初始化U={v}。以v到其他顶点的所有边为候选边;(2)重复以下步骤n-1次,使得其他n-1个顶点被加入到U中:

①从候选边中挑选权值最小的边加入TE,设该边在V-U中的顶点是k,将k加入U中;

②考察当前V-U中的所有顶点j,修改候选边:若(k,j)的权值小于原来和顶点j关联的候选边,则用(k,j)取代后者作为候选边。7.4生成树和最小生成树6/74采用普里姆算法求最小生成树的过程01243123546870124312354687UV-U7.4生成树和最小生成树7/740124312354687UV-U0124312354687UV-U7.4生成树和最小生成树8/740124312354687UV-U012431246最小生成树7.4生成树和最小生成树9/74实现普里姆算法(1/3):建立了两个辅助数组closest和lowcost。所有顶点分为U和V-U两个顶点集。U中的顶点i:lowcost[i]=0;V-U中的顶点j:lowcost[j]>0。iU中i:lowcost[i]=0jV-U中j:lowcost[j]>07.4生成树和最小生成树10/74由于是无向图,U到V-U的边与V-U到U的边相同。这里考虑V-U到U的边。对于V-U中的每个顶点j,记录它到U中的一条最小边:closest[j]存储该边依附的在U中的顶点编号,lowcost[j]存储该边的权值。kU中k:lowcost[k]=0jV-U中j:lowcost[j]>0vlowcost[j]closest[j]=k实现普里姆算法(2/3):7.4生成树和最小生成树11/74实现普里姆算法(3/3):U中顶点的增量添加的:一个一个添加U中添加顶点k之前的情况:jvlowcost[j]closest[j]U中添加顶点k之后的情况:对于j:若g.edges[k][j]<lowcost[j]

调整;否则不变

kjvlowcost[j]closest[j]g.edges[k][j]7.4生成树和最小生成树12/74为了方便,假设图G采用邻接矩阵g存储,对应的Prim(g,v)算法如下:voidPrim(MatGraphg,intv) //输出求得的最小生树的所有边{intlowcost[MAXVEX]; //建立数组lowcost

intclosest[MAXVEX]; //建立数组closest

intmin,i,j,k;

for(i=0;i<g.n;i++) //给lowcost[]和closest[]置初值

{ lowcost[i]=g.edges[v][i]; closest[i]=v;

}7.4生成树和最小生成树13/74for(i=1;i<g.n;i++) //构造n-1条边

{min=INF;k=-1;

for(j=0;j<g.n;j++) //在(V-U)中找出离U最近的顶点k

if(lowcost[j]!=0&&lowcost[j]<min)

{min=lowcost[j];

k=j;

//k为最近顶点的编号

}

printf("边(%d,%d),权值为%d\n",closest[k],k,min);

lowcost[k]=0;

//标记k已经加入U

for(j=0;j<g.n;j++) //修正数组lowcost和closest

if(lowcost[j]!=0&&g.edges[k][j]<lowcost[j])

{

lowcost[j]=g.edges[k][j];

closest[j]=k;

}

}}普里姆算法中有两重for循环,所以时间复杂度为O(n2),其中n为图的顶点个数。由于与e无关,所以普里姆算法特别适合于稠密图求最小生成树。7.4生成树和最小生成树14/747.4.3克鲁斯卡尔算法克鲁斯卡尔(Kruskal)算法是一种按权值的递增次序选择合适的边来构造最小生成树的方法。G=(V,E)

T=(U,TE),构造最小生成树T的步骤如下:(1)置U的初值等于V(即包含有G中的全部顶点),TE的初值为空集(即图T中每一个顶点都构成一个连通分量)。(2)将图G中的边按权值从小到大的顺序依次选取:若选取的边未使生成树T形成回路,则加入TE;否则舍弃,直到TE中包含n-1条边为止。7.4生成树和最小生成树15/74实现克鲁斯卡尔算法的关键是如何判断选取的边是否与生成树中已保留的边形成回路?为此设置一个辅助数组vset[0..n-1],它用于判定两个顶点之间是否连通。数组元素vset[i](初值为i)代表编号为i的顶点所属的连通子图的编号。对于边(i,j),若vset[i]=vset[j]

不选;否则选取。一旦选取边(i,j),将两个连通分量的所有vset值改为vset[i]或者vset[j]。7.4生成树和最小生成树16/74首先需要对所有边按权值递增排序,为此定义一个具有如下类型的边数组E[]:typedefstruct{intu; //边的起始顶点intv; //边的终止顶点

intw; //边的权值}Edge; //边数组元素类型从图的邻接矩阵g中提取出边数组E,然后按边权值递增排序。7.4生成树和最小生成树17/74构造最小生成树012431235468712346012430123400007.4生成树和最小生成树18/74实现克鲁斯卡尔算法:假设采用直接插入排序法对边集E按权值递增排序。voidSortEdge(EdgeE[],inte)//直接插入排序:对E数组按权值递增排序{inti,j,k=0;

Edgetemp;

for(i=1;i<e;i++){ temp=E[i]; j=i-1;

//从右向左在有序区E[0..i-1]中找E[i]的插入位置

while(j>=0&&temp.w<E[j].w)

{E[j+1]=E[j]; //将权值大于E[i].w的记录后移

j--; }

E[j+1]=temp; //在j+1处插入E[i]

}}7.4生成树和最小生成树19/74voidKruskal(MatGraphg) //输出求得的最小生树的所有边{inti,j,u1,v1,sn1,sn2,k;

intvset[MAXVEX]; //建立数组vset

EdgeE[MAXE]; //建立存放所有边的数组E

k=0;

//k统计E数组中边数

for(i=0;i<g.n;i++) //由图的邻接矩阵g产生的边集数组E{for(j=0;j<=i;j++) //提取邻接矩阵中部分元素

{

if(g.edges[i][j]!=0&&g.edges[i][j]!=INF)

{ E[k].u=i;E[k].v=j; E[k].w=g.edges[i][j];

k++; //累加边数

}}}

SortEdge(E,k);

//对E数组按权值递增排序

for(i=0;i<g.n;i++)vset[i]=i;

//初始化辅助数组7.4生成树和最小生成树20/74k=1; //k表示当前构造生成树的第几条边,初值为1

j=0; //j为E数组下标,初值为0

while(k<g.n) //生成的边数小于n时循环

{u1=E[j].u;v1=E[j].v; //取一条边的头尾顶点

sn1=vset[u1];

sn2=vset[v1]; //分别得到两顶点所属的集合编号

if(sn1!=sn2)

//两顶点属不同的集合,取该边{printf("边(%d,%d),权值为%d\n",u1,v1,E[j].w);

k++;

//生成的边数增1

for(i=0;i<g.n;i++) //两个集合统一编号

{

if(vset[i]==sn2)//集合编号为sn2的改为sn1

vset[i]=sn1;}

}

j++; //扫描下一条边

}}7.4生成树和最小生成树21/74上述克鲁斯卡尔算法不是最优算法,在改进后可达到O(elog2e)。一般认为克鲁斯卡尔算法的时间复杂度是O(elog2e)。由于仅仅与e有关,所以克鲁斯卡尔算法特别适合于稀疏图求最小生成树。7.4生成树和最小生成树22/747.5最短路径求从一个顶点到其他各顶点的最短路径,称之为单源最短路径问题;求每对顶点之间的最短路径,称之为多源最短路径问题。7.5最短路径求带权有向图最短路径问题分为两种情况:23/747.5.1单源最短路径算法求单源最短路径算法是由狄克斯特拉(Dijkstra)提出的,称为狄克斯特拉算法。给定一个图G和一个起始顶点即源点v,求v到其他顶点的最短路径长度及最短路径。7.5最短路径24/74狄克斯特拉算法的具体步骤如下:初始时,顶点集S只包含源点,即S={v},顶点v到自已的距离为0。顶点集U包含除v外的其他顶点,源点v到U中顶点i的距离为边上的权(若v与i有边<v,i>)或∞(若顶点i不是v的出边相邻点)。从U中选取一个顶点u,它是源点v到U中距离最小的一个顶点,然后把顶点u加入S中(该选定的距离就是源点v到顶点u的最短路径长度)。vjSU=V-Su7.5最短路径25/74以顶点u为新考虑的中间点,修改源点v到U中各顶点j(j∈U)的距离。重复步骤②和③直到S包含所有的顶点即U为空。vujwujcvucvj两条路径中选最小者7.5最短路径26/74实现狄克斯特拉算法:设置一个数组dist[0..n-1],dist[i]用来保存从源点v到顶点i的目前最短路径长度。path[j]保存源点到顶点j的最短路径,实际上为最短路径上的前一个顶点u,即path[j]=u。当求出最短路径后由path[j]向前推出源点到顶点j的最短路径。path[j]=uvuj7.5最短路径27/740132456461685662417Udistpath最小点u012345601234561,2,3,4,5,60466∞∞∞0000-1-1-117.5最短路径28/740132456461685662417Udistpath最小点u012345601234561,2,3,4,5,60466∞∞∞0000-1-1-112,3,4,5,6045611∞∞00101-1-127.5最短路径29/740132456461685662417Udistpath最小点u012345601234561,2,3,4,5,60466∞∞∞0000-1-1-112,3,4,5,6045611∞∞00101-1-123,4,5,60456119∞001012-137.5最短路径30/740132456461685662417Udistpath最小点u012345601234561,2,3,4,5,60466∞∞∞0000-1-1-112,3,4,5,6045611∞∞00101-1-123,4,5,60456119∞001012-134,5,60456119∞001012-157.5最短路径31/740132456461685662417Udistpath最小点u012345601234561,2,3,4,5,60466∞∞∞0000-1-1-112,3,4,5,6045611∞∞00101-1-123,4,5,60456119∞001012-134,5,60456119∞001012-154,6045610917001052547.5最短路径32/740132456461685662417Udistpath最小点u012345601234561,2,3,4,5,60466∞∞∞0000-1-1-112,3,4,5,6045611∞∞00101-1-123,4,5,60456119∞001012-134,5,60456119∞001012-154,60456109170010525460456109160010524604561091600105247.5最短路径33/74最后求出顶点0到1~6各顶点的最短距离分别为4、5、6、10、9和16。path值为{0,0,1,0,5,2,4}。以求顶点0到顶点4的最短路径为例说明通过path求最短路径的过程:path[4]=5,path[5]=2,path[2]=1,path[1]=0(源点),则顶点0到顶点4的最短路径逆为4、5、2、1、0,则正向最短路径为0→1→2→5→4。7.5最短路径34/74对应的狄克斯特拉算法如下(v为源点编号):voidDijkstra(MatGraphg,intv)//求从v到其他顶点的最短路径{intdist[MAXVEX]; //建立dist数组

intpath[MAXVEX];

//建立path数组

intS[MAXVEX];

//建立S数组

intmindis,i,j,u=0;

for(i=0;i<g.n;i++)

{ dist[i]=g.edges[v][i];//距离初始化

S[i]=0;

//S[]置空

if(g.edges[v][i]<INF)//路径初始化

path[i]=v;

//v→i有边时,置i前一顶点为v else

//v→i没边时,置i前一顶点为-1

path[i]=-1;

}7.5最短路径35/74S[v]=1; //源点编号v放入S中

for(i=0;i<g.n-1;i++) //循环向S中添加n-1个顶点

{mindis=INF; //mindis置最小长度初值

for(j=0;j<g.n;j++) //选取不在S中且有最小距离顶点u{if(S[j]==0&&dist[j]<mindis)

{u=j;

mindis=dist[j];

}}

S[u]=1;

//顶点u加入S中

for(j=0;j<g.n;j++) //修改不在s中的顶点的距离{

if(S[j]==0)

{if(g.edges[u][j]<INF&&dist[u]+g.edges[u][j]<dist[j])

{dist[j]=dist[u]+g.edges[u][j];

path[j]=u;

}}}

}}狄克斯特拉算法Dijkstra(g,v)的时间复杂度为O(n2)。7.5最短路径36/747.5.2多源最短路径算法求解每对顶点之间的最短路径的一个办法是:每次以一个顶点为源点,重复执行Dijkstra算法n次,这样便可以求得每一对顶点之间的最短路径。解决该问题的另一种方法是弗洛伊德(Floyd)算法。7.5最短路径37/74假设有向图G=(V,E)采用邻接矩阵g表示,另外设置一个二维数组A用于存放当前顶点之间的最短路径长度,即分量A[i][j]表示当前顶点i到顶点j的最短路径长度。弗洛伊德算法的基本思想是递推产生一个矩阵序列A0、A1、…、Ak、…、An-1,其中Ak[i][j]表示从顶点i到顶点j的路径上所经过的顶点编号不大于k的最短路径长度。7.5最短路径38/74归纳起来,弗洛伊德思想可用如下的表达式来描述:A-1[i][j]=g.edges[i][j]Ak[i][j]=MIN{Ak-1[i][j],Ak-1[i][k]+Ak-1[k][j]}0≤k≤n-1ikjAk-1[i][j]两条路径中选最小者Ak[i][j]=MIN{

Ak-1[i][j],

Ak-1[i][k]+Ak-1[k][j]}Ak-1[k][j]Ak-1[i][k]7.5最短路径39/74另外用二维数组path保存最短路径,它与当前迭代的次数有关,即当迭代完毕,path[i][j]存放从顶点i到顶点j的最短路径的前一个顶点的编号。ikjAk-1[i][j]Ak-1[k][j]Ak-1[i][k]abpathk-1[i][j]=b,pathk-1[k][j]=a若Ak-1[i][j]>Ak-1[i][k]+Ak-1[k][j],选择经过顶点k的路径,即pathk[i][j]=a=pathk-1[k][j]。否则不改变。7.5最短路径40/74012353273124A-1path-105∞7-10-10∞042-1-111330222-12∞∞10-1-13-1弗洛伊德算法求多源最短路径7.5最短路径41/74012353273124A0path005∞7-10-10∞042-1-111330222-12∞∞10-1-13-1在考虑顶点0时:没有任何最短路径得到修改!7.5最短路径42/74012353273124在考虑顶点1时:0→2:由无路径改为0→1→2,长度为9,path[0][2]改为1A1path10597-1010∞042-1-111330222-12∞∞10-1-13-17.5最短路径43/74012353273124在考虑顶点2时:1→0:由无路径改为1→2→0,长度为7,path[1][0]改为23→0:由无路径改为3→2→0,长度为4,path[3][0]改为23→1:由无路径改为3→2→1,长度为4,path[3][1]改为2A2path20597-101070422-111330222-124410223-17.5最短路径44/74012353273124在考虑顶点3时:0→2:由0→1→2改为0→3→2,长度为8,path[0][2]改为31→0:由1→2→0改为1→3→2→0,长度为6,path[1][0]改为21→2:由1→2改为1→3→2,长度为3,path[1][2]改为3A3path30587-103060322-131330222-124410223-17.5最短路径45/74在得到A3和path3后,由A3数组可以直接得到两个顶点之间的最短路径长度,如A3[1][0]=6,说明顶点1到0的最短路径长度为6。path[1][0]=2,说明顶点0的前一顶点是顶点2,path[1][2]=3,表示顶点2的前一个顶点是顶点3,path[1][3]=1,表示顶点3的前一个顶点是顶点1,找到起点。依次得到的顶点序列为0、2、3、1,则顶点1到0的最短路径为1→3→2→0。A3path30587-103060322-131330222-124410223-17.5最短路径46/74弗洛伊德算法如下:voidFloyd(MatGraphg) //求每对顶点之间的最短路径{intA[MAXVEX][MAXVEX]; //建立A数组

intpath[MAXVEX][MAXVEX]; //建立path数组

inti,j,k;

for(i=0;i<g.n;i++) //给数组A和path置初值{for(j=0;j<g.n;j++)

{A[i][j]=g.edges[i][j];

if(i!=j&&g.edges[i][j]<INF)

path[i][j]=i; //i和j顶点之间有一条边时

else

//i和j顶点之间没有一条边时

path[i][j]=-1;

}}7.5最短路径47/74for(k=0;k<g.n;k++)

//求Ak[i][j]{for(i=0;i<g.n;i++)

{

for(j=0;j<g.n;j++)

{if(A[i][j]>A[i][k]+A[k][j])

//找到更短路径

{A[i][j]=A[i][k]+A[k][j];//修改路径长度

path[i][j]=path[k][j];//修改最短路径

}}

}} 弗洛伊德算法Floyd(g)中有三重循环,其时间复杂度为O(n3)。ikjAk-1[i][j]Ak-1[k][j]Ak-1[i][k]7.5最短路径48/74

【例7.13】给定n个村庄之间的交通图,如下图所示,若村庄i与村庄j之间有路可通,则将顶点i与顶点j之间用边连接,边上的权值wij表示这条道路的长度。

现打算在这n个村庄中选定一个村庄建一所医院。设计一个算法求该医院应建在哪个村庄(称为最佳村庄),能使其他所有村庄到医院的路径总和最短(当有多个这样的村庄时,求出任一个村庄即可)。4302136412967.5最短路径49/74先采用Floyd算法求出图中每对顶点之间的最短路径长度数组A。再累加每行的元素之和并放到B数组中,其中B[i]表示顶点i到其他所有顶点的最短路径长度之和,最后求出B中最小元素B[minv],并返回minv。假设村庄图采用邻接矩阵g表示。50/740123400129931120610152960410391040643151060求出的A:033143229329434求出的B:最佳村庄编号为2或者37.5最短路径51/747.6拓扑排序设G=(V,E)是一个具有n个顶点的有向图,图中用顶点表示活动,用边表示活动之间的优先关系,这样的有向图称为用顶点表示活动的网,简称AOV(ActivityOnvertexNetwork)网。该网中顶点序列v1、v2、…、vn称为一个拓扑序列,当且仅当该顶点序列满足下列条件:若<vi,vj>是图中的边(即从顶点vi到顶点vj有一条路径),则在序列中顶点vi必须排在顶点vj之前。在一个有向图中找一个拓扑序列的过程称为拓扑排序。7.6拓扑排序52/74例如,计算机专业的学生必须完成一系列规定的基础课和专业课才能毕业,假设这些课程的名称与相应编号如下表所示。课程编号课程名称先修课程C1高等数学无C2程序设计无C3离散数学C1C4数据结构C2,C3C5编译原理C2,C4C6操作系统C4,C7C7计算机组成原理C2C1C3C4C6C5C2C77.6拓扑排序53/74对这个有向图进行拓扑排序可得到拓扑序列:

C1

C3

C2

C4

C7

C6

C5

C2

C7

C1

C3

C4

C5

C6C1C3C4C6C5C2C7课程学习安排:第1学期第2学期7.6拓扑排序54/74拓扑排序步骤如下:(1)从AOV网中选择一个没有前驱(即入度为0)的顶点并且输出它。(2)从AOV网中删去该顶点,并且删去从该顶点发出的全部有向边。(3)重复上述两步,直到剩余的网中不再存在没有前驱的顶点为止。7.6拓扑排序55/74C1C3C4C6C5C2C7拓扑排序过程:拓扑序列:C1C3C2C4C7C6C5拓扑排序完成!7.6拓扑排序56/74对任一有向图进行拓扑排序有两种结果:图中全部顶点都包含在拓扑序列中,这说明该图中不存在有向回路;图中部分顶点未被包含在拓扑序列中,这说明该图中存在有向回路。所以可以采用拓扑排序判断一个有向图中是否存在回路。7.6拓扑排序57/74【例7.14】给出下图G11的全部可能的拓扑排序序列。

从图中看到,入度为0有两个顶点,即0和4。

先考虑顶点0:删除0及相关边,入度为0者有4;删除4及相关边,入度为0者有1和5;考虑顶点1,删除1及相关边,入度为0者有2和5;如此得到拓扑序列:041253,041523,045123。0123457.6拓扑排序58/74

再考察顶点4,类似地得到拓扑序列:450123,401253,405123,401523。因此,所有的拓扑序列为:041253,041523,045123,450123,401253,405123,401523。0123457.6拓扑排序59/74用带权有向图(DAG)描述工程的预计进度,以顶点表示事件,有向边表示活动,边e的权c(e)表示完成活动e所需的时间(比如天数),或者说活动e持续时间。图中入度为0的顶点表示工程的开始事件(如开工仪式),称为源点;出度为0的顶点表示工程结束事件,称为汇点。则称这样的有向图为AOE网(ActivityOnEdge)。7.7AOE网与关键路径7.7AOE网与关键路径60/747

整个工程完成的时间为:从有向图的源点到汇点的最长路径,具有最大长度的路径叫关键路径。abcdefghk6452118244例如:

“关键活动”指的是:该边上的权值增加将使有向图上的最长路径的长度增加。

注意:在一个AOE网中,可以有不止一条的关键路径。源点汇点7.7AOE网与关键路径61/74求关键路径求关键活动关键路径是由关键活动构成的。下面介绍求关键活动的步骤。7.7AOE网与关键路径62/74事件的最早开始和最迟开始时间

(1)事件v的最早开始时间:规定源点事件的最早开始时间为0。定义图中任一事件v的最早开始时间(earlyevent)

ee(v)等于x、y、z到v所有路径长度的最大值,即:ee(v)=0

当v为源点时ee(v)=MAX{ee(x)+a,ee(y)+b,ee(z)+c} 否则xyzvabcee(v)=?ee(x)ee(y)ee(z)从左向右推进计算这是为什么源点要唯一!7.7AOE网与关键路径63/74

(2)事件v的最迟开始时间:定义在不影响整个工程进度的前提下,事件v必须发生的时间称为v的最迟开始时间(lateevent),记作le(v)。le(v)应等于ee(y)与v到汇点的最长路径长度之差,即:vxyzabcle(v)=?le(x)le(y)le(z)le(v)=ee(v) 当v为汇点时le(v)=MIN{le(x)-a,le(y)-b,le(z)-c} 否则从右向左推进计算这是为什么汇点要唯一!7.7AOE网与关键路径64/74活动的最早开始时间和最迟开始时间

(3)活动a的最早开始时间e(a):指该活动起点x事件的最早开始时间,即:

e(a)=ee(x)xy活动a时间为cee(x)le(y)

(4)活动a的最迟开始时间l(a):指该活动终点y事件的最迟开始时间与该活动所需时间之差,即:

l(a)=le(y)-c7.7AOE网与关键路径65/74

(5)关键活动:对于每个活动a,求出d(a)=l(a)-e(a),若d(a)为0,则称活动a为关键活动。7.7AOE网与关键路径66/74对关键活动来说,不存在富余时间。显然,关键路径上的活动都是关键活动。找出关键活动的意义在于,可以适当地增加对关键活动的投资(人力、物力等),相应地减少对非关键活动的投资,从而减少关键活动的持续时间,缩短整个工程的工期。7.7AOE网与关键路径67/74按拓扑序列计算各事件的ee(v)如下:ee(A)=0ee(B)=ee(A)+c(a1)=6ee(C)=ee(A)+c(a2)=4ee(D)=ee(A)+c(a3)=5ee(E)=MAX(ee(B)+c(a4),ee(C)+c(a5)}=MAX{7,5}=7【例7.15】产生一个拓扑序列:ABCDEFGHI。ABCDFGHEIa1=6a2=4a3=5a4=1a5=1a6=2a7=9a8=7a10=2a11=4a9=47.7AOE网与关键路径68/74ee(F)=ee(E)+c(a7)=16ee(G)=ee(E)+c(a8)=14ee(H)=ee(D)+c(a6)=7ee(I)=MAX{ee(F)+c(a10),ee(G)+c(a11),ee(H)+c(a9)}=MAX(18,18,11}=18ABCDFGHEIa1=6a2=4a3=5a4=1a5=1a6=2a7=9a8=7a10=2a11=4a9=47.7AOE网与关键路径69/74

按拓扑序列

温馨提示

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

评论

0/150

提交评论