关键路径
AOE网
- 一个带权的有向无环图,顶点表示时间,弧表示活动,弧上的权值表示活动持续的时间
- 实际工程问题:
- 估算完成整个工程至少需要多少时间
- 判断那些活动是关键活动
关键路径
- 关键路径:源点->汇点的带权路径长度最大的路径称为关键路径,关键路径上的活动称为关键活动
关键路径的确定:
事件\(V_i\)的最早发生时间\(ve[i]\)
- 事件发生的最早时间是从源点到\(V_i\)的最大路径长度
- 最大:需要事件\(V_i\)的所有入边活动都已经完成,\(V_i\)才可以开始
- 利用[[拓扑排序]]从源点向汇点递推,计算事件的最早发生时间
- \(ve[i] =\max(V_e + W_{ei})\)
事件\(V_i\)的最晚发生时间\(vl[i]\)
- 事件\(V_i\)的最迟发生时间不能影响其所有后继的最迟发生时间,即\(V_i\)的最迟发生时间减去活动\(a_{ik} = <V_i, V_k>\)的持续时间
- 利用逆拓扑排序,从汇点向源点递推,求解事件的最迟发生时间
- 初始化汇点的最迟发生时间为汇点的最早发生时间
活动\(a_i = <V_j,V_k>\)的最早发生事件\(e[i]\)
活动\(a_i = <V_j,V_k>\)的最晚发生事件\(l[i]\)
- 活动\(a_i\)的最迟发生时间等于弧尾的最迟发生时间减去边值,\(l[i] = vl[k]-w_{jk}\)
算法步骤
- 利用拓扑排序,将拓扑排序结果保存在\(topo[]\)
- 将每个事件的最早发生时间初始化为0,
- 根据拓扑顺序从前向后一次求每个事件的最早发生时间,循环执行以下操作
- 正序取出拓扑序列中的顶点\(k\)
- 依次处理\(k\)的每一个邻接点 (出) ,**更新顶点\(j\)的最早发生事件\(ve[j]\)
if(ve[j] < ve[k] + p->weight) ve[j] = ve[k] + p->weight
- 初始化事件的最晚发生时间
- 根据逆拓扑排序从后向前,求解每个事件的最迟发生时间
- 逆序取出拓扑序列中的顶点
- 依次处理\(k\)的每个邻接点 (入),**更新顶点\(k\)的最迟发生时间\(vl[k]\)
if(vl[k] > vl[j] - p->weight) vl[k] = vl[j] - p->weight
- 求关键活动:若最早与最迟发生时间相同,则为关键活动