数据结构——第四章图:05拓扑排序和关键路径

1.拓扑排序问题提出:假设以有向图表示一个工程的施工图或程序的数据流图,则图中不允许出现回路(检查有向图中是否存在回路的方法之一,是对有向图进行拓扑排序)。

2.拓扑排序:对有向图进行如下操作:按照有向图给出的次序关系,将图中顶点排成一个线性序列,对于有向图中没有限定次序关系的顶点,则可以人为加上任意的次序关系。由此所得顶点的线性序列称之为拓扑有序序列。拓扑排序过程如下图所示:

对于下列有向图,因为图中存在一个回路{B, C, D},所以不能求得它的拓扑有序序列。

3.拓扑排序步骤:

(1)从有向图中选取一个没有前驱的顶点(入度为零的顶点),并输出。

(2)从有向图中删除此顶点以及所有以它为尾的弧;

重复上述两步,直至图空,或者图不空但找不到无前驱的顶点为止。

4.关键路径问题的提出:假设以有向网表示一个施工流图,弧上的权值表示完成该项子工程所需时间。影响整个工程完成期限的子工程项被称为关键工程。从起点到终点具有最大路径长度(该路径上的各个活动所持续的时间之和)的路径称为关键路径。

⑴ 只有在某顶点所代表的事件发生后,从该顶点出发的各活动才能开始;

⑵ 只有在进入某顶点的各活动都结束,该顶点所代表的事件才能发生。

5.整个工程完成的时间为:从有向图的源点到汇点的最长路径。关键活动指的是该弧上的权值增加使有向图上的最长路径的长度增加。

6.求关键活动方法:该活动的最早开始时间 = 该活动的最迟开始时间。

(1)事件(顶点)的最早发生时间ve(j) = 从源点到顶点j的最长路径长度;

(2)事件(顶点)的最迟发生时间vl(k) = 从顶点k到汇点的最短路径长度;

(3)活动(弧)的最早开始时间ee(i) = ve(j);

(4)活动(弧)的最迟开始时间el(i) = vl(k) - dut(<j, k>); //dut为该弧权值 

7.事件发生时间的计算公式:

(1)ve(源点) = 0;ve(k) = Max{ve(j) + dut(<j, k>)};

(2)vl(汇点) = ve(汇点);vl(j) = Min{vl(k) - dut(<j, k>)};

例如下图求关键路径过程:

     

8.求ve的顺序是按拓扑有序次序,求vl的顺序是按拓扑逆序的次序。

转载于:https://www.cnblogs.com/hou36/p/9919524.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
拓扑排序是一种对有向无环图进行排序的算法,它可以得到一个有向无环图的线性序列。在拓扑排序中,每个顶点表示一个任务,每个有向边表示一个任务之间的依赖关系,即如果任务A依赖于任务B,则在序列中任务A必须在任务B之后。拓扑排序可以用来解决很多实际问题,如编译器的依赖关系分析、任务调度等。 关键路径是指在一个有向无环图中,从源点到汇点的所有路径中,耗时最长的路径称为关键路径关键路径上的任务称为关键任务,如果关键任务延迟了,整个项目的完成时间也会相应地延迟。因此,关键路径分析可以帮助我们找到项目中最关键的任务,以便优化项目进度。 拓扑排序的算法流程如下: 1. 统计每个顶点的入度(即有多少条边指向该顶点),并将入度为0的顶点加入队列。 2. 从队列中取出一个顶点,输出该顶点,并将该顶点的所有邻接点的入度减1。 3. 如果邻接点的入度为0,则将其加入队列。 4. 重复步骤2和3,直到队列为空。 关键路径的算法流程如下: 1. 对有向无环图进行拓扑排序,得到每个顶点的最早开始时间。 2. 从源点开始,按照拓扑序列依次计算每个顶点的最晚开始时间。 3. 对于每个任务,计算它的最早开始时间和最晚开始时间之差,即为该任务的总浮动时间。 4. 对于关键路径上的任务,它们的总浮动时间为0,因为它们不能延迟。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值