【数据结构】关键路径中为什么事件的最早发生时间是源点到顶点的最长路径长度?

简介: 【数据结构】关键路径中为什么事件的最早发生时间是源点到顶点的最长路径长度?

在思考这个问题之前,我们先来了解一下,在关键路径中,开始和发生有什么区别?

开始和发生

  “发生”是针对于事件的,也就是图中的顶点。只有在指向该顶点的所有有向边对应的活动结束,该顶点所代表的事件才发生。

  举个例子,一个事件C,它仅被两条边a, b指向,仅当a,b两活动都完成时,事件C发生。

  “开始”是针对于活动的,也就是图中的边。只有在一个顶点所代表的事件发生后,从该顶点出发的所有边对应的活动才能开始。

最早发生时间

  刚开始我也很疑惑,为什么是最长的路径长度决定最早的发生时间呢?难道不应该是越想要早发生就越应该走短的路径吗?

  后面我才明白,最短路径和关键路径根本不是一回事,求最短路径是找尽可能短的路来保证路径长度最小,你只需要找出一条最短的路就行。但是在关键路径里,一个顶点是有多个前提的,只有前提的路径都走完,才能发生该顶点的事件,那么只有最长的路径走完,保证其余短的路都早已经走完,该事件才发生。

  我们前面说过,发生是针对于事件的,一个事件要发生,首先要指向它的活动都完成。一个事件C,被两个活动a,b指向,a活动的耗费时间是3, b活动的耗费时间是5。那么看下图,从开始到C事件的发生要多久呢?
image.png

  是最大路径长度5,因为C事件发生的前提必须是a,b两活动完成(活动可同时进行),C事件只有等到b完成才发生,最早完成时间由耗时最久的路决定,所以这就是为什么要取最长路径长度。

最迟发生时间

  最迟发生时间的定义是这样的:在不推迟整个工程完成的前提下,保证后继事件j能在其最迟发生时间vl(j)能够发生时,该事件最迟必须发生的时间。

  首先,我们要知道,汇点的最迟发生时间就是它的最早发生时间(可以理解为汇点的最早发生时间就是工期),求VL的过程我们是从汇点倒着推回去的。

  其次,为什么会有最迟发生时间呢?这是因为一个工程中,通常会存在某条路径耗时比其他路径久的多,所以耗时短的事件可以不必太早发生,也就是存在着缓冲时间。

  我们来看一下下面这个例子,看看最迟发生时间是多少?
image.png

  看看这个图,我在顶点上方写了它的最早发生时间,D是汇点,110是它的最早发生时间(也是最迟发生时间)。

  此时我们可以这样理解,如果在110天时工程必须完成,那么A事件最迟什么时候要发生?

  我们可以用110减去a活动用时,得到105,也就是说A事件最迟可以在第105天发生(一旦发生就要立刻开始a活动,否则将推迟整个工期),指向A的活动可以在第100天才开始。

  而A事件最早可以在第5天就发生(这里说最早才有意义了),最早第5天完成,但是可以推迟到第105天完成,中间差了100天了。

  同理可得B事件的最迟发生时间是第10天,它一刻也不能拖。

  这时候再回去看看最迟发生时间的定义,应该就可以理解了吧。

时间余量

  d(i) = l(i) - e(i),即活动最迟开始时间与最早开始时间的差额,这代表着活动可以拖延的时间。如果一个活动的时间余量为0,就意味着该活动不能拖延时间,称为关键活动,必须立即完成,否则就将拖延整个工期。

  而时间余量为0的所有边连起来,就是关键路径了。

  要求时间余量d, 就要先求活动的最早开始时间e和最迟开始时间l,要求e和l就要先求事件最早发生时间ve和最迟发生时间vl。所以做题步骤就出来啦,最后来做一题试试看吧!
image.png

答案如下:
image.png

最终得到的关键路径为(v1, v3, v4, v6)

最后注意的几点:

1、关键路径上的所有活动都是关键活动, 它是决定整个工程的关键因素,因此可以通过加快关键活动来缩短整个工期。但是也不能任意缩短,因为一旦缩短到一定的程度,该关键活动就可能变成非关键活动了

2、网中的关键路径不唯一,对于有好几条关键路径的网,只加快其中某一条关键路径上的活动并不能缩短工期。只有加快存在于所有关键路径上的关键活动才能达到缩短工期的目的。

相关文章
|
机器学习/深度学习 数据建模 定位技术
【数据结构】图的基本概念—无/有向图、权和网、完全图、路径与回路
【数据结构】图的基本概念—无/有向图、权和网、完全图、路径与回路
2963 0
【数据结构】图的基本概念—无/有向图、权和网、完全图、路径与回路
|
5月前
|
算法 C语言
数据结构与算法——拓扑排序(引例、拓扑排序、伪代码、代码、关键路径问题)
数据结构与算法——拓扑排序(引例、拓扑排序、伪代码、代码、关键路径问题)
50 0
|
存储 C++
剑指offer(C++)-JZ34:二叉树中和为某一值的路径(二)(数据结构-树)
剑指offer(C++)-JZ34:二叉树中和为某一值的路径(二)(数据结构-树)
剑指offer(C++)-JZ34:二叉树中和为某一值的路径(二)(数据结构-树)
|
存储 算法 C++
剑指offer(C++)-JZ84:二叉树中和为某一值的路径(三)(数据结构-树)
剑指offer(C++)-JZ84:二叉树中和为某一值的路径(三)(数据结构-树)
剑指offer(C++)-JZ82:二叉树中和为某一值的路径(一)(数据结构-树)
剑指offer(C++)-JZ82:二叉树中和为某一值的路径(一)(数据结构-树)
|
存储 算法 搜索推荐
大话数据结构--拓扑排序和关键路径
大话数据结构--拓扑排序和关键路径
155 0
|
算法 机器人 C++
数据结构与算法之最短路路径与最短路径和&&动态规划
数据结构与算法之最短路路径与最短路径和&&动态规划
252 0
数据结构与算法之最短路路径与最短路径和&&动态规划
数据结构191-图论-添加顶点边代码
数据结构191-图论-添加顶点边代码
56 0
数据结构191-图论-添加顶点边代码
数据结构189-添加顶点边
数据结构189-添加顶点边
56 0
数据结构189-添加顶点边
|
算法
数据结构上机实践第14周项目2 - 二叉树排序树中查找的路径
数据结构上机实践第14周项目2 - 二叉树排序树中查找的路径
数据结构上机实践第14周项目2 - 二叉树排序树中查找的路径

热门文章

最新文章