• 【数据结构】选择题快速求解AOE网的关键路径


    引言

    求解AOE网关键路径时,书上的方法为先从源点到汇点求解事件最早发生时间ve,再从汇点到源点求解事件最迟发生时间vl,再利用ve和vl求解每个活动的最早开始时间e(i)和最迟开始时间l(i),e(i)和l(i)相等的活动则为关键活动,关键活动组成的从源点到汇点的路径即为关键路径。

    王道书关于求解快速路径只是简单提了一嘴 如果这是一道选择题,根据上述求ve()的过程就已经能知道关键路径 ,并没有告诉你如何快速地求解关键路径,本文就此补充说明一下。

    求法

    这里直接举例给出求法

    如下AOE图

    在这里插入图片描述
    我们从V1开始(按照拓扑序列)依次求解事件的最早发生时间ve,前三个顶点答案很显然,求得如下

    v1v2v3v4v5
    “事件的最早发生时间” ve()032--

    在求解 V 4 V4 V4 的时候,需要对两条路径进行比较,即 V e ( 4 ) = m a x { V e ( 2 ) + a 3 , V e ( 3 ) + a 5 } = m a x { 5 , 6 } = 6 Ve(4)=max\{Ve(2)+a3,Ve(3)+a5\}=max\{5,6\}=6 Ve(4)=max{Ve(2)+a3,Ve(3)+a5}=max{5,6}=6显然选取的是 a 5 a5 a5 这条路径。

    这意味着 a 3 a3 a3 这条路径对 V 4 V4 V4 来讲是 “冗余的” ,或者说因为 a 5 a5 a5 的存在,它有可以改变的空间。也就是 a 3 a3 a3 一定不是关键路径。我们可以叉掉它。
    在这里插入图片描述
    同样的 (不难看出Ve(5)=3+3=6)
    V e ( 6 ) = m a x { V e ( 5 ) + a 8 , V e ( 4 ) + a 7 , V e ( 2 ) + a 6 } = m a x { 6 , 8 , 5 } = 8 Ve(6)=max\{Ve(5)+a8,Ve(4)+a7,Ve(2)+a6\}=max\{6,8,5\}=8 Ve(6)=max{Ve(5)+a8,Ve(4)+a7,Ve(2)+a6}=max{6,8,5}=8
    叉掉不是关键路径的 a 8 a8 a8 a 6 a6 a6

    按照以上思路,我们完成ve()的求解,并叉掉那些比较时被比下去的路径。
    最后得到:
    在这里插入图片描述
    直观一点,我们把这些路径都去掉:
    在这里插入图片描述
    于是,我们得到关键路径
    V 1 ⇒ V 2 ⇒ V 4 ⇒ V 6 V1\Rightarrow V2\Rightarrow V4\Rightarrow V6 V1V2V4V6
    上图中,V1是源点,V6是汇点,完成工程意味着 V1到V6的一条路径,而去掉“不关键”的路径(活动边)后还可以走通的路径就是关键路径。
    即上图中的(V1,V3,V4,V6)或者说(a2,a5,a7)
    (注:a1和a4虽然保留在图中,但并不是关键活动,因为他们不在关键路径上)

    总结

    我们在求解Ve()的时候,遇到某个顶点有多个入度,需要用max比较获得最大的事件最早发生时间时,被比下去的路径可以被叉掉,选取数值最大的路径,并保留它,最终获得的就是关键路径。

  • 相关阅读:
    搁置收购推特后,马斯克盛赞微信:什么都能做、还没有垃圾信息
    git log 用法
    ET-G2-D24-4A-A、ET-G2-D24-2A-V两路独立设置比例控制器
    正点原子FreeRTOS(中)
    爬虫这样怎么提取href?
    使用VScode进行C++开发
    将Bean放入Spring容器中的方式有哪些?
    【嵌入式——QT】线程同步
    Vue中如何进行分布式日志收集与日志分析(如ELK Stack)
    PHP之mysql面试题大全(持续更新中)
  • 原文地址:https://blog.csdn.net/weixin_45827203/article/details/125534494