DAG图和关键路径_第1页
DAG图和关键路径_第2页
DAG图和关键路径_第3页
DAG图和关键路径_第4页
DAG图和关键路径_第5页
已阅读5页,还剩50页未读 继续免费阅读

下载本文档

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

文档简介

普里姆(Prim)算法4316504535562217431650453556221702143165045355622170214021543165045355622170214021540532210214021543165045355622174053221410535221431045352214316504535562217021402154053221410535221

设N=(V,E,C)为连通网,TE是N的最小支撑树的边的集合。①算法开始时,U={uo}(uo∈V),TE=○;②找到满足weight(u,v)=min{weight(u1,v1)|u1∈U,v1∈V-U}, 的边,把它并入集合TE中,v同时并入U。③反复执行②,直至V=U时终止算法。

[例]1104532104532123104532210431453221431045352214316504535562217克鲁斯卡尔(Kruskar)算法

设连通网N=(V,E,C),T为N的最小支撑树。初始时T={V,{○}},即T中没有边,只有n个顶点就是n个连通分量。①在E中选择权值最小的边,将此边从E中删除。②如果此边的两个顶点在T的不同的连通分量中,则将此边加入到T中,从而导致T中减少一个连通分量;如果此边的两个顶点在同一个连通分量中,则重复执行①②

,直至T中仅剩一个连通分量时,终止操作。

7.5拓扑排序7.5.1基本概念AOV网:在有向图中,用顶点表示活动,用有向边表示活动之间的先后关系,称这样的有向图为AOV网(ActivityOnVertexNetwork)。例如,计算机专业学生的学习就是一个工程,每一门课程的学习就是整个工程的一些活动。其中有些课程要求先修课程,有些则不要求。这样在有的课程之间有领先关系,有的课程可以并行地学习。[例]计算机专业必修课程安排

计算机专业必修课程课程代号 课程名称 先修课程

C0

高等数学 无

C1

程序设计基础 无

C2 离散数学C0,C1

C3

数据结构 C2,C4

C4

程序设计语言

C1

C5

编译技术

C3,C4

C6

操作系统

C3,C8

C7

普通物理 C0

C8

计算机原理C7

C0C2C3C5C4C1C7C6C8

7.5拓扑排序7.5.1基本概念AOV网:在有向图中,用顶点表示活动,用有向边表示活动之间的先后关系,称这样的有向图为AOV网(ActivityOnVertexNetwork)。计划、施工过程、生产流程、程序流程等都是“工程”。除了很小的工程外,一般都把工程分为若干个叫做“活动”的子工程。完成了这些活动,这个工程就可以完成了。在AOV网络中,如果活动ai必须在活动aj之前进行,则存在有向边<Vi

,Vj>,AOV网络中不能出现有向回路,即有向环。在AOV网络中如果出现了有向环,则意味着某项活动应以自己作为先决条件。因此,对给定的AOV网络,必须先判断它是否存在有向环。

拓扑序列:就是把AOV网中的所有顶点排成一个线性序列,使每个活动的所有前驱活动都排在该活动的前边。

拓扑排序:构造AOV网的拓扑序列的过程被称为拓扑排序。拓扑排序算法基本步骤①

从网中选择一个入度为0的顶点且输出之。②

从网中删除该顶点及其所有出边。③

执行①②,直至所有顶点已输出,或网中剩余顶点入度均不为0为止。例如,对学生选课工程图进行拓扑排序:

C6C0C2C3C5C4C1C7C8得到的某拓扑有序序列为C0,C1,C2,C4,C3,C5,C7,C8,C6或C0,C7,C8,C1,C4,C2,C3,C6,C5

结果:对于任何无回路的AOV网,其所有顶点均可排成拓扑序列,并且其拓扑序列未必唯一。思考:利用拓扑排序可以检查AOV网是否存在环路,到底是通过什么方式检查的呢?再例如,对学生选课工程图进行拓扑排序:

C6C0C2C3C5C4C1C7C8得到的拓扑有序序列为C0,C1,C2,C7,C8

结果:对于任何无回路的AOV网,其所有顶点均可排成拓扑序列,并且其拓扑序列未必唯一。

结论:

如果通过拓扑排序能将AOV网络的所有顶点都排入一个拓扑有序的序列中,则该AOV网络中必定不会出现有向环;相反,如果得不到满足要求的拓扑有序序列,则说明AOV网络中存在有向环,此AOV网络所代表的工程是不可行的。

7.5.2剖析拓扑排序算法[例]325140002123013425indegree0243152∧42∧3∧53∧5∧5∧拓扑排序算法描述:325140InitStack(S);for(i=0;i<G.vexnum;++i)//建零入度顶点栈Sif(!indegree[i])Push(S,i);//入度为0者进栈count=0;//对输出顶点计数002123013425top00stack初始top=-1indegree拓扑排序算法描述:325140InitStack(S);for(i=0;i<G.vexnum;++i)//建零入度顶点栈Sif(!indegree[i])Push(S,i);//入度为0者进栈count=0;//对输出顶点计数002123013425top0101stackindegree拓扑排序算法描述:325140InitStack(S);for(i=0;i<G.vexnum;++i)//建零入度顶点栈Sif(!indegree[i])Push(S,i);//入度为0者进栈count=0;//对输出顶点计数002123013425top0101stackindegree拓扑排序算法描述:325140InitStack(S);for(i=0;i<G.vexnum;++i)//建零入度顶点栈Sif(!indegree[i])Push(S,i);//入度为0者进栈count=0;//对输出顶点计数002123013425top0101stackindegree拓扑排序算法描述:325140InitStack(S);for(i=0;i<G.vexnum;++i)//建零入度顶点栈Sif(!indegree[i])Push(S,i);//入度为0者进栈count=0;//对输出顶点计数002123013425top0101stackindegree拓扑排序算法描述:325140InitStack(S);for(i=0;i<G.vexnum;++i)//建零入度顶点栈Sif(!indegree[i])Push(S,i);//入度为0者进栈count=0;//对输出顶点计数002123013425top0101stackindegree

while(!StackEmpty(S)){Pop(S,i);printf(i,G.vertices[i].data);++count;//输出i号顶点并计数for(p=G.vertices[i].firstarc;p;p=p->nextarc){k=p->adjvex;//对i号顶点的每个邻接点的入度减1if(!(--indegree[k]))Push(S,k);//若入度减为0,则入栈}}top0101stack3251400243152∧42∧3∧53∧5∧5∧p002123013425indegreek

while(!StackEmpty(S)){Pop(S,i);printf(i,G.vertices[i].data);++count;//输出i号顶点并计数for(p=G.vertices[i].firstarc;p;p=p->nextarc){k=p->adjvex;//对i号顶点的每个邻接点的入度减1if(!(--indegree[k]))Push(S,k);//若入度减为0,则入栈}}top0101stack3251400243152∧42∧3∧53∧5∧5∧p002023013425indegreek

while(!StackEmpty(S)){Pop(S,i);printf(i,G.vertices[i].data);++count;//输出i号顶点并计数for(p=G.vertices[i].firstarc;p;p=p->nextarc){k=p->adjvex;//对i号顶点的每个邻接点的入度减1

if(!(--indegree[k]))Push(S,k);//若入度减为0,则入栈}}top0104

stack3251400243152∧42∧3∧53∧5∧5∧p002023013425indegreek

while(!StackEmpty(S)){Pop(S,i);printf(i,G.vertices[i].data);++count;//输出i号顶点并计数for(p=G.vertices[i].firstarc;p;p=p->nextarc){k=p->adjvex;//对i号顶点的每个邻接点的入度减1if(!(--indegree[k]))Push(S,k);//若入度减为0,则入栈}}top0104stack3251400243152∧42∧3∧53∧5∧5∧p001023013425indegreek

while(!StackEmpty(S)){Pop(S,i);printf(i,G.vertices[i].data);++count;//输出i号顶点并计数for(p=G.vertices[i].firstarc;p;p=p->nextarc){k=p->adjvex;//对i号顶点的每个邻接点的入度减1if(!(--indegree[k]))Push(S,k);//若入度减为0,则入栈}}top0104stack3251400243152∧42∧3∧53∧5∧5∧p001013013425indegreek

while(!StackEmpty(S)){Pop(S,i);printf(i,G.vertices[i].data);++count;//输出i号顶点并计数for(p=G.vertices[i].firstarc;p;p=p->nextarc){k=p->adjvex;//对i号顶点的每个邻接点的入度减1if(!(--indegree[k]))Push(S,k);//若入度减为0,则入栈}}top0104

stack3251400243152∧42∧3∧53∧5∧5∧001013013425indegree

if(count<G.vexnum)returnERROR;//该有向图有回路elsereturnOK;

7.6关键路径7.6.1基本概念如果在有向无环的带权图中用有向边表示一个工程中的各项活动(Activity)用边上的权值表示活动的持续时间(Duration)用顶点表示事件(Event)则这样的有向图叫做用边表示活动的网络,简称AOE(ActivityOnEdges)网络。●源点:表示整个工程的开始(入度为零)。●汇点:表示整个工程的结束(出度为零)。325140867a1=6a8=7a7=9a6=2a4=1a5=1a3=5a2=4a9=4a11=4a10=2汇点

源点[例]某工程(1)完成整个工程至少需要多少时间?(2)为完成工程所需的时间,应当加快哪些活动?在AOE网络中,有些活动顺序进行,有些活动并行进行。从源点到各个顶点,以至从源点到汇点的有向路径可能不止一条。这些路径的长度也可能不同。完成不同路径的活动所需的时间虽然不同,但只有各条路径上所有活动都完成了,整个工程才算完成。因此,完成整个工程所需的时间取决于从源点到汇点的最长路径长度,即在这条路径上所有活动的持续时间之和。这条路径长度最长的路径就叫做关键路径(CriticalPath)。325140867a1=6a8=7a7=9a6=2a4=1a5=1a3=5a2=4a9=4a11=4a10=2汇点

源点[例]某工程●关键路径:从源点到汇点具有最大长度的路径称 为关键路径。●路径长度:指路径上的各边权值之和。325140867a1=6a8=7a7=9a6=2a4=1a5=1a3=5a2=4a9=4a11=4a10=2汇点

源点关键活动有关的量:①事件vi的最早发生时间ve(i):从源点v0到vi的最长路径长度。325140867a1=6a8=7a7=9a6=2a4=1a5=1a3=5a2=4a9=4a11=4a10=2汇点

源点ve(k)=0k=0max{ve(j)+weight(<j

,k>)}

<vj,vk>∈E(G),k=1,2,…,n-1事件vi的最早发生时间ve(i)

325140867a1=6a8=7a7=9a6=2a4=1a5=1a3=5a2=4a9=4a11=4a10=2汇点源点ve(0)=0ve(1)=ve(0)+weight(<0,1>)=0+6=6ve(2)=ve(0)+weight(<0,2>)=0+4=4ve(3)=ve(0)+weight(<0,3>)=0+5=5ve(4)=max{ve(1)+weight(<1

,4>),

ve(2)+weight(<2

,4>)}=max{6+1,4+1}=7

325140867a1=6a8=7a7=9a6=2a4=1a5=1a3=5a2=4a9=4a11=4a10=2汇点源点ve(5)=ve(3)+weight(<3,5>)=5+2=7ve(6)=ve(4)+weight(<4,6>)=7+9=16ve(7)=max{ve(4)+weight(<4,7>),

ve(5)+weight(<5,7>)}=max{7+7,7+4}=14ve(8)=max{ve(6)+weight(<6,8>),

ve(7)+weight(<7,8>)}=max{16+2,14+4}1=6a8=7a7=9a6=2a4=1a5=1a3=5a2=4a9=4a11=4a10=2汇点

源点关键活动有关的量:②事件vi的最迟发生时间vl(i):保证汇点的最早发生时间不推迟的前提下事件vi允许的最迟开始时间,等于ve(n-1)减去从vi到vn-1最长路径长度。325140867a1=6a8=7a7=9a6=2a4=1a5=1a3=5a2=4a9=4a11=4a10=2汇点

源点事件vi的最迟发生时间vl(i)vl(j)=ve(n-1)j=n-1min{vl(k)-weight(<j

,k>)}<vj,vk>∈E(G),j=n-2,n-3,…,0

325140867a1=6a8=7a7=9a6=2a4=1a5=1a3=5a2=4a9=4a11=4a10=2汇点源点vl(8)=ve(8)=18vl(7)=vl(8)-weight(<7,8>)=18-4=14vl(6)=vl(8)-weight(<6,8>)=18-2=16vl(5)=vl(7)-weight(<5,7>)=14-4=10vl(4)=min{vl(7)-weight(<4

,7>),

vl(6)-

weight(<4

,6>)}=min{14-7,16-9}=7

325140867a1=6a8=7a7=9a6=2a4=1a5=1a3=5a2=4a9=4a11=4a10=2汇点源点vl(3)=vl(5)-weight(<3,5>)=10-2=8vl(2)=vl(4)-weight(<2,4>)=7-1=6vl(1)=vl(4)-weight(<1,4>)=7-1=6vl(0)=min{vl(1)-weight(<0

,1>),

vl(2)-weight(<0

,2>),

vl(3)-weight(<0

,3>)}=min{6-6,6-4,8-5}=0325140867a1=6a8=7a7=9a6=2a4=1a5=1a3=5a2=4a9=4a11=4a10=2汇点

源点关键活动有关的量:③活动ai的最早开始时间e(i):设活动ai在有向边<vj,vk>上,ve(j)是从源点v0到vj的最长路径长度。因此e(i)=ve(j)。325140867a1=6a8=7a7=9a6=2a4=1a5=1a3=5a2=4a9=4a11=4a10=2汇点

源点活动ai的最早开始时间e(i)aie(i)

a1a2a3a4a5a6a7a8a9a10a11

0006457771614vive(i)064577161418

0

1

2

3

4

5

6

7

8

325140867a1=6a8=7a7=9a6=2a4=1a5=1a3=5a2=4a9=4a11=4a10=2汇点

源点关键活动有关的量:④活动ai的最迟开始时间l(i):l(i)是在不会引起时间延误的前提下,该活动允许的最迟开始时间。设活动ai在有向边<vj,vk>上,则l(i)=vl(k)-weight(<j,k>)3251408

温馨提示

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

评论

0/150

提交评论