关键路径c语言源程序,关键路径法及C语言实现

在学习拓扑排序一节时讲到拓扑排序只适用于 AOV 网,本节所介绍的求关键路径针对的是和 AOV 网相近的 AOE 网。

AOE网

AOE 网是在 AOV 网的基础上,其中每一个边都具有各自的权值,是一个有向无环网。其中权值表示活动持续的时间。

b65f031268c0e977beb03da117e10dfc.png

如图 1 所示就是一个 AOE 网,例如 a1=6 表示完成 a1 活动完成需要 6 天;AOE 网中每个顶点表示在它之前的活动已经完成,可以开始后边的活动,例如 V5 表示 a4 和 a5 活动已经完成,a7 和 a8 可以开始。

使用 AOE 网可以帮助解决这样的问题:如果将 AOE 网看做整个项目,那么完成整个项目至少需要多少时间?

解决这个问题的关键在于从 AOE 网中找到一条从起始点到结束点长度最长的路径,这样就能保证所有的活动在结束之前都能完成。

起始点是入度为 0 的点,称为“源点”;结束点是出度为 0 的点,称为“汇点”。这条最长的路径,被称为”关键路径“。

关键路径

为了求出一个给定 AOE 网的关键路径,需要知道以下 4 个统计数据:

对于 AOE 网中的顶点有两个时间:最早发生时间(用 Ve(j) 表示)和最晚发生时间(用 Vl(j) 表示);

对于边来说,也有两个时间:最早开始时间(用 e(i) 表示)和最晚开始时间( l(i) 表示)。

Ve(j):对于 AOE 网中的任意一个顶点来说,从源点到该点的最长路径代表着该顶点的最早发生时间,通常用 Ve(j) 表示。

例如,图 1 中从 V1 到 V5 有两条路径,V1 作为源点开始后,a1 和 a2 同时开始活动,但由于 a1 和 a2 活动的时间长度不同,最终 V1-V3-V5 的这条路径率先完成。但是并不是说 V5 之后的活动就可以开始,而是需要等待 V1-V2-V5 这条路径也完成之后才能开始。所以对于 V5 来讲,Ve(5) = 7。

Vl(j):表示在不推迟整个工期的前提下,事件 Vk 允许的最晚发生时间。

例如,图 1 中,在得知整个工期完成的时间是 18 天的前提下,V7 最晚要在第 16 天的时候开始,因为 a10 活动至少需要 2 天时间才能完成,如果在 V7 事件在推迟,就会拖延整个工期。所以,对于 V7 来说,它的 Vl(7)=16。

e(i):表示活动 ai 的最早开始时间,如果活动 ai 是由弧 表示的,那么活动 ai 的最早开始的时间就等于时间 Vk 的最早发生时间,也就是说:e[i] = ve[k]。

e(i)很好理解,拿图 1 中 a4 来说,如果 a4 想要开始活动,那么首先前提就是 V2 事件开始。所以 e[4]=ve[2]。

l(i):表示活动 ai 的最晚开始时间,如果活动 ai 是由弧 表示,ai 的最晚开始时间的设定要保证 Vj 的最晚发生时间不拖后。所以,l[i]=Vl[j]-len。

在得知以上四种统计数据后,就可以直接求得 AOE 网中关键路径上的所有的关键活动,方法是:对于所有的边来说,如果它的最早开始时间等于最晚开始时间,称这条边所代表的活动为关键活动。由关键活动构成的路径为关键路径。

求关键路径的具体过程

对图 1 中的 AOE 图求关键路径,首先完成 Ve(j)、Vl(j)、e(i)、l(i) 4 种统计信息的准备工作。

Ve(j),求出从源点到各顶点的最长路径长度为(长度最大的):

a56168f184a9589b2323b29b1568ddf9.png

Vl(j),求出各顶点的最晚发生时间(从后往前推,多种情况下选择最小的):

bad33dc27005449cf0a5abc8ffcc239f.png

e(i),求出各边中ai活动的最早开始时间:

045f2a1dab6fb044ace6d250ee7740e8.png

l(i),求各边中ai活动的最晚开始时间(多种情况下,选择最小的):

e1437bd1783949fd411c4a25607d6f74.png

通过对比 l(i) 和 e(i) ,其中 a1 、 a4 、 a7 、 a8 、 a10 、 a11 的值都各自相同,所以,在图 1 中的 AOE 网中有两条关键路径:

4c690fe8aecd3f0923853d079179dc10.png

图 2 关键路径

关键路径的代码实现

#include

#include

#define MAX_VERTEX_NUM 20//最大顶点个数

#define VertexType int//顶点数据的类型

typedef enum{false,true} bool;

//建立全局变量,保存边的最早开始时间

VertexType ve[MAX_VERTEX_NUM];

//建立全局变量,保存边的最晚开始时间

VertexType vl[MAX_VERTEX_NUM];

typedef struct ArcNode{

int adjvex;//邻接点在

拿图 1 中的 AOE 网为例,运行的结果为:

9,11

1

2

3

4

5

6

7

8

9

1,2,6

1,3,4

1,4,5

2,5,1

3,5,1

4,6,2

5,7,9

5,8,7

6,8,4

7,9,2

8,9,4

0  3  5  0  3

0  2  4  0  2

0  1  6  0  0 *

1  4  1  6  6 *

2  4  1  4  6

3  5  2  5  8

4  7  7  7  7 *

4  6  9  7  7 *

5  7  4  7 10

6  8  2 16 16 *

7  8  4 14 14 *

通过运行结果,可以看出关键活动有 6 个(后面带有 * 号的),而组成的关键路径就如图 2 中所示。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值