《数据结构》关键路径问题【高手进】

一、关键路径问题
设计一个程序求出完成整项工程至少需要多少时间以及整项工程中的关键活动。
要求:
1、对一个描述工程的AOE网,应判断其是否能够顺利进行。
2、若该工程能顺利进行,输出完成整项工程至少需要多少时间,以及每一个关键活动所依附的两个顶点、最早发生时间、最迟发生时间。�0�2

感谢各路高手

第1个回答  2013-10-26
AOE网(Activity On Edge)即边表示活动的网,是一个带权的有向无环图,其中顶点表示事件(Event),每个事件表示在它之前的活动已经完成,在它之后的活动可以开始,弧表示活动,权表示活动持续的时间。AOE网可用来估算工程的完成时间。由于整个工程只有一个开始点和一个完成点,故在正常的情况(无环)下,网中只有一个入度为零的点(源点)和一个出度为零的点(汇点)。

由于在AOE网中有些活动可以并行地进行,所以完成工程的最短时间是从开始点到完成点的最长路径的长度(路径上各活动持续时间之和)。路径长度最长的路径叫做关键路径。假设开始点是v1,从v1到vi的最长路径长度叫做事件vi的最早发生时间,这个时间决定了所有以vi为尾的弧所表示的活动的最早开始时间。用e(i)表示活动ai的最早开始时间,l(i)为一个活动的最迟开始时间,这是在不推迟整个工程完成的前提下,活动ai最迟必须开始进行的时间。两者之差l(i)-e(i)意味着完成活动ai的时间余量。l(i)=e(i)的活动叫做关键活动。关键路径上的所有活动都是关键活动,提前完成非关键活动(不在关键路径的活动)并不能加快工程的进度。为了求得AOE网中活动的e(i)和l(i),首先应求得事件的最早发生时间ve(j)和最迟发生时间vl(j)。如果活动ai由弧<j, k>表示,其持续时间记为dut(<j, k>),则有:e(i) = ve(j), l(i) = vl(k) - dut(<j, k>)。求ve(j)和vl(j)需分两步进行:

从ve(0)=0开始向前递推,其中T是所有以第j个顶点为头的弧的集合。

从vl(n-1)=ve(n-1)起向后递推,其中S是所有以第i个顶点为尾的弧的集合。

活动ai的最早开始时间e[i]

若活动ai是由弧<vi,vj>表示,根据AOE网的性质,只有事件vi发生了,活动ai才能开始。也就是说,活动ai的最早开始时间应等于事件vi的最早发生时间。因此,有:e[i]=ve[i]
活动ai的最晚开始时间l[i]

活动ai的最晚开始时间指,在不推迟整个工程完成日期的前提下,必须开始的最晚时间。若 由弧< vi,vj>>表示,则ai的最晚开始时间要保证事件vj的最迟发生时间不拖后。因此,应该有:l[i]=vl[j]-dut(<vi,vj>)
由此得到求关键路径的算法:

输入e条弧<j, k>,建立AOE网的存储结构;
从源点出发,令ve[0]=0,按拓扑顺序求其余各顶点的最早发生时间ve[i](1<=i<=n-1)。如果得到的拓扑有序序列中顶点个数小于网中顶点数n,则说明网中存在环,不能求关键路径,算法终止,否则转到步骤(3);
从汇点vn出发,令vl[n-1]=ve[n-1],按逆拓扑顺序求其余各顶点的最迟发生时间vl[i](n-2>=i>=0);
根据各顶点的ve和vl值,求每条弧s的最早开始时间e(s)和最迟开始时间l(s)。若某弧满足条件e(s)=l(s),则为关键活动。
第2个回答  2013-10-26
《数据结构实用教程(第二版)》清华大学出版社
第296页开始有介绍。
“最早发生时间应等于从源点到该顶点的所有路径上的最长路径之和”
“每个事件的最迟发生时间应等于汇点的最迟发生时间减去从该事件的顶点到汇点的最长路径长度”
主要还是依赖于拓扑排序。
相似回答