算法小讲堂之关键路径

Posted MangataTS

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法小讲堂之关键路径相关的知识,希望对你有一定的参考价值。

文章目录

前言

AOE网

在带权有向图中, 以顶点表示事件,以有向边表示活动,以边上的权值表示完成该活动的开销(如完成活动所需的时间),称之为用边表示活动的网络,简称 A O E AOE AOE

A O E AOE AOE 网和 A O V AOV AOV 网都是有向无环图,不同之处在于, A O E AOE AOE 网的边有权值,而 A O V AOV AOV 网无权值,仅表示顶点之间的前后关系, A O E AOE AOE 网的两个性质如下:

  • ①只有在某顶点所代表的事件发生后,从该顶点出发的各有向边所代表的活动才能开始
  • ②只有在进入某顶点的各有向边所代表的活动都已结束时,该顶点所代表的事件才能发生。

注意

  • A O E AOE AOE 网中,有些活动是可以并行进行
  • 从源点到汇点的有向路径可能有多条, 并且这些 路径长度可能不同,因此从源点到汇点中最大路径长度(即最大边权和)的路径称为关键路径,关键路径上的活动称为关键活动 ,显然这个关键路径可能有多条
  • 只有所有路径的活动都完成,整个工程才算结束

事件 V k V_k Vk 的最早发生时间 V e ( K ) Ve(K) Ve(K)

它是指从源点 V 1 V_1 V1 到顶点 V k V_k Vk 的最长路径长度。事件 V k V_k Vk 的最早发生时间决定了所有从 V k V_k Vk 开始的 活动能够开工的最早时间 。 可用下面的边推公式来计算:

  • V e ( 源点 ) = 0 Ve(源点)=0 Ve(源点)=0
  • V e ( k ) = M a x V e ( j ) + W e i g h t ( V j , V k ) Ve(k) = MaxVe(j)+Weight(V_j,V_k) Ve(k)=MaxVe(j)+Weight(Vj,Vk) ,其中的 V k V_k Vk V j V_j Vj 的任意后继结点, W e i g h t ( V j , V k ) Weight(V_j,V_k) Weight(Vj,Vk) 表示 < V j , V k > <V_j,V_k> <Vj,Vk> 边上的权值

简单理解一下,假设我们当前走到了点 j j j ,然后我们将点 j j j 的所有出度点 k k k V e ( k ) Ve(k) Ve(k) 值和当前 j j j 点的 V e ( j ) Ve(j) Ve(j)加边权 < j , k > <j,k> <j,k> 进行比较,如果后者大就更新为后者(就是尽可能让 V e ( k ) Ve(k) Ve(k) 更大),看到这个我们很自然想起了拓扑排序,我们可以再拓扑排序的基础上进行计算

这里说一下为什么称为 最早发生时间 ,毕竟刚接触怎么看都是**“最迟”** ,想象一下,这个 A O E AOE AOE 网是从源点出发,可能会存在多个活动并行进行的情况,但目的都是到达汇点,那么在这个过程中,可能通过某些活动(弧)早到,有的活动(弧)晚到,其中最晚到的活动(弧)就是关键活动,对于那些能 “早到” 的路径来说就会存在两个情况,是先完成活动再等待那个所谓的关键活动完成,还是先等待关键活动,然后再完成这个活动,这里先完成当前的活动就是最早发生时间,而等待后再来完成就是一个活动开始最迟时间,很显然在关键路径上的最早发生时间和最迟发生时间是一样的

事件 V k V_k Vk 的最迟发生事件 V l ( K ) Vl(K) Vl(K)

它是指在不推迟整个工程完成的前提下, 即保证它的后继事件 V j V_j Vj 在其最迟发生时间 V l ( j ) Vl(j) Vl(j) 能够 发生时,该事件最迟必须发生的时间 。 可用下面的递推公式来计算:

  • V l ( 汇点 ) = V e ( 汇点 ) Vl(汇点)=Ve(汇点) Vl(汇点)=Ve(汇点)
  • V l ( k ) = M i n V l ( j ) + W e i g h t ( V k , V j ) Vl(k) = MinVl(j) + Weight(V_k,V_j) Vl(k)=MinVl(j)+Weight(Vk,Vj) ,其中点 V k V_k Vk V j V_j Vj 的任意前驱结点, W e i g h t ( V k , V j ) Weight(V_k,V_j) Weight(Vk,Vj) 表示 < V k , V j > <V_k,V_j> <Vk,Vj> 边上的权值

这里其实和上面流程其实是类似的,只不过需要从汇点出发一直到源点,那么这个很显然就是一个逆拓扑排序的操作,然后不断地尽可能最小化 V l ( k ) Vl(k) Vl(k) 的值,当然对于关键路径上的活动的 V l ( k ) Vl(k) Vl(k) V e ( k ) Ve(k) Ve(k) 是相同的

活动 a i a_i ai 的最早开始时间 e ( i ) e(i) e(i)

它是指该活动弧的起点所表示的事件的最早发生时间。若边 < V k , V j > <V_k, V_j> Vk,Vj> 表示活动 a i a_i ai ,则有 e ( i ) = V e ( k ) e(i) =Ve(k) e(i)=Ve(k)

活动 a i a_i ai 的最迟开始时间 l ( i ) l(i) l(i)

它是指该活动弧的终点所表示事件的最迟发生时间与该活动所需时间之差。若边 < V k , V j > <V_k,V_j> VkVj 表示活动 a i a_i a算法小讲堂之B树和B+树(浅谈)|考研笔记

[智联讲堂]数据结构与算法–关键路径

算法小讲堂之ST表算法详解

算法小讲堂之你真的会双指针吗?

算法小讲堂之最短路算法(Floyd+bellman+SPFA+Dijkstra)

算法小讲堂之哈希表|散列表|考研笔记