关键路径法和最小生成树

1、关键路径法概述

关键路径的服务对象是“AOE网”(Activity on edge netword)。不同的是AOV网只考虑顶点事件,而AOE网除了顶点事件(如v[0])外,重点还有就是有向边还表示了活动(如e[0][1] = a0)。其中顶点事件也可以标记是若干个活动的结束,也可以标记是若干个活动的开始。

名词的定义:

首先是“源点”,指的是AOE网中,入度为0的顶点。然后是“终点”,指的是AOE网中,出度为0的顶点。

AOE网相关性质:

性质1:只有在进入某顶点的活动都已经结束后,该顶点所代表的事件才发生;

性质2:只有在某顶点所代表的事件发生后,从该顶点出发的各活动才开始。

在AOE网中,所有活动都完成才能到达“终点”,因此完成整个工程所必须花费的时间(即最短工期)应该为源点到终点的最大路径长度。具有最大路径长度的路径称为关键路径。关键路径上的活动成为关键活动

2、图解

关键路径的确定需要用到的各活动的“最早开始时间”、“最早结束时间”、“最迟开始时间”、“最迟结束时间”,然后当“最迟开始时间”-“最早开始时间”或“最迟结束时间”-“最早结束时间”的结果为0,则对应的这个活动就是关键活动,由这些活动构成的“起点”到“终点”的路径就是关键路径。

先从“起点”出发到“终点”,将最早开始时间和最早结束时间先确定如下图(最早开始时间是对应活动之前的顶点事件前的所有活动刚结束的最大时间,比如对活动a4的最早开始时间,应该是活动a1和a2的最早结束时间的最大值即ES[4] = max(9,10) = 10):

所以,整个工程的最快完结时间是15。接着,从“终点”回溯回“起点”,确定每个活动的最迟结束时间和最迟开始时间。我们从a5和a4分别确定最迟结束时间都是15,LF[4] = LF[5] = 15,对应LS[4] =LF[4] - 5 = 10, LS[5] = LF[5] - 2 = 13...LF[0] = min(LS[2],LS[3]) = 7。

按照关键路径的定义,下图橘黄色圆圈圈出来的即为关键路径。

3、实现

在进行关键路径判断时,首先要确定给出的AOE网是有向无环图。所以,就需要用到上一讲中的“拓扑排序”了。具体的求关键路径和关键活动的算法步骤如下:

1)、利用拓扑排序求出AOE网的一个拓扑序列(同时也就判断了是否是有向无环图,若是,则执行接下来的操作);

2)、从拓扑序列的第一个顶点开始,按拓扑顺序依次计算每个事件的最早开始时间ES[i]和最早结束时间EF[i]。

3)、从拓扑序列的最后一个顶点开始,按逆拓扑顺序依次计算每个事件的最迟结束时间LF[i]和最迟开始时间LS[i]。

4)、对每个活动,若LF[i]-ES[i]=0,则对应第i个活动为关键活动,输出的关键活动的序列就是关键路径。

注:为方便编码,这里将开始时间存到对应的顶点中,即只计算顶点对应时间的最早开始时间,即下图中对应存储的方式为:

ES[0] = 0,ES[1] = 7,ES[2] = 10,ES[3] = 11,ES[4]=15。

逆序后存对应顶点的最迟开始时间为:

LS[4]=15,LS[3]=13,LS[2]=10,LS[1]=7,LS[0]=0。

因此,判断关键路径的时候要做如下遍历边来处理,即找到最短路径。

ES[u]是否等于LS[u->v]-w[u->v]。比如<0,1>是不是关键路径,这个时候,ES[0] = 0, LS[V]-W[u,v]=7-7=0,所以<0,1>是关键路径。对<0,2>,遍历中发现LS[2]-W[0,2] = 10-9 = 1≠ES[0],因此<0,2>不是关键路径。

1、最小生成树概述

图的最小生成树里有两个关键词,一个是“树”,一个是“最小”。首先,对“树”而言,必须无环,并且要连接图中的所有顶点(否则就成了森林了),即任意顶点可以连通,因此对n个顶点的图来说,它的最小生成树有(n-1)条边。其次,对“最小”而言,同样一个图可能有若干不同的生成树,把对应生成树边上的权值相加,得到权值和最小的那棵树就是该图的最小生成树。如下面一幅图:

生成树1:权值和=10+9+2+3 = 24。

生成树2:权值和=4+9+6+7 = 26。

最小生成树:权值和=4+2+3+7 = 16。

最小生成树在现实中有很多的应用,典型的有,比如上述节点代表的是城市,边是城市间铺设管道,对应边上的权值是铺设管道的成本,要让各个城市间管道能够连通,并且从经济上考虑铺设的管道成本和最小,这个时候权值和最小的生成树就能够满足这种需求。

接下来我们介绍两种构建最小生成树的方法——Kruskal算法和Prim算法,这两种算法都用到了贪心的思想,即构建的时候每一步都选择权值最小的边,不同点是Kruskal用了每次直接选择不构成环的待选的权值最小的边,而Prime则是每次选择跟当前生成树连通边权值最小的顶点。

2、Kruskal算法

Kruskal算法也称为“加边法”,理解起来相对比较简单一些,我们来看具体步骤:

1). 把图中的所有的边取出,放到列表中,并按权值从小到大排序;

2). 把图中的n个顶点打散(亦可看成是5棵树构成的森林);

3). 按权值从小到大选边,所选的边连接的两个顶点(u,v),应属于两棵不同的树,即当前边是否可选,取决于加入进来后会不会形成环,如果会,那么这条边要舍弃。这里,我们可以用上一讲中的并查集的思想来判断。若新加边不构成环,则选中为最小生成树的一条边,即将这两棵树合并为一棵树。

4). 重复(3),直到生成树中有(n-1)条边为止。

执行过程如下:

出现回路,(2,5)这条边放弃。

已生成(n-1)条边,图中也可以看出来每个结点都已连通。最小生成树已构建完毕。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值