一、拓扑排序

1.1 基本知识

有向无环图:一个有向图中不存在环,简称DAG图

AOV网:用DAG图表示一个工程,其顶点表示活动,用有向边 <Vi,Vj><V_i, V_j><Vi​,Vj​> 表示活动 ViV_iVi​ 必须先于活动 VjV_jVj​ 进行的这样一种关系。

  1. 在AOV网中,活动 ViV_iVi​ 是活动 VjV_jVj​ 的先行活动,活动 VkV_kVk​ 是活动 ViV_iVi​ 的先行活动,则活动 VkV_kVk​ 必是活动 VjV_jVj​ 的先行活动,这种先行关系具有传递性

  2. AOV网不具有唯一性

1.2 求拓扑排序的基本思想
  1. 从有向图中选一个无前驱(入度为0)的顶点输出
  2. 将此顶点和以它为起点的弧删除
  3. 重复步骤1和步骤2,直到不存在无前驱的顶点
  4. 若此时输出的顶点数小于有向图中的顶点数,则说明有向图中存在回路,否则输出的顶点的顺序即为一个拓扑序列。
1.3 图示过程

如图a,V1的入度为0,V2的入度为1,V3的入度为2,V4的入度为2,V5的入度为2,所以将V1取出,如图b

如图b,V2的入度为0,V3的入度为2,V4的入度为1,V5的入度为2,所以将V2取出,如图c

如图c,V3的入度为1,V4的入度为0,V5的入度为2,所以将V4取出,如图d

如图d,V3的入度为0,V5的入度为1,所以将V3取出,如图e

如图e,V5的入度为0,所以将V5取出,如图f

此时没有其他顶点了,整个拓扑排序为:{V1,V2,V4,V3,V5}

1.4 算法思想
  1. 求所有顶点的入度,可以附设一个存放各顶点入度的数组indegree[]

  2. 把所有入度为0的顶点入队列或栈

  3. 当栈或队列不空时

    1. 出栈或出队列顶点为u,输出顶点u
    2. 顶点u的所有邻接点入度减一,如果有入度为O的顶点,则入栈或入队
  4. 若此时输出的顶点数小于有向图中的顶点数,则说明有向图中存在回路,否则输出的顶点的顺序即为一个拓扑序列。

二、关键路径

2.1 基本知识

AOE网:在带权有向图图中,以顶点表示事件,以有向边表示活动,以边上的权值表示完成该活动的开销(比如完成活动的时间)

AOE网的性质:

  1. 只有在某顶点所代表的事件发生后,从该顶点出发的各有向边所代表的活动才能开始
  2. 只有在进入某一顶点的各有向边所代表的活动都已结束时,该顶点所代表的事件才能发生
2.2 求关键路径的基本思想

ve(Vi)ve(V_i)ve(Vi​):表示事件 ViV_iVi​ 的最早发生时间

该时间是指从开始顶点 VVV 到顶点 ViV_iVi​ 的最长路径,事件的最早发生时间决定了所有从 ViV_iVi​ 开始的活动能够开工的最早时间。可用下面的递推公式来计算∶
ve(Vi)=max⁡i{ve(Vi)+wi,j}(wi,j表示<Vi,Vj>上的权值)ve(V_i)=\max\limits_{i} \bigg\{ve(V_i)+w_{i,j}\bigg\}(w_{i,j}表示<V_i,V_j>上的权值) ve(Vi​)=imax​{ve(Vi​)+wi,j​}(wi,j​表示<Vi​,Vj​>上的权值)

vl(Vi)vl(V_i)vl(Vi​):表示事件 ViV_iVi​ 的最晚发生时间

该时间是指在不推迟整个工程完成的前提下,即保证它所指向的事件 ViV_iVi​ ,即保证它所指向的事件 ViV_iVi​ 在 ve(Vi)ve(V_i)ve(Vi​) 时刻能够发生时,该事件最迟必须发生的时间。可用下面的递推公式来计算∶
ve(Vi)=min⁡j{vl(Vj)−wi,j}ve(V_i)=\min\limits_{j} \bigg\{vl(V_j)-w_{i,j}\bigg\} ve(Vi​)=jmin​{vl(Vj​)−wi,j​}

e(Vi)e(V_i)e(Vi​):表示事件 ViV_iVi​ 的最早开始时间

该时间是指该活动的起点所表示的事件最早发生的时间。若边 <Vi,Vk><V_i, V_k><Vi​,Vk​> 表示活动 aia_iai​,则有如下公式
e(Vi)=ve(Vj)e(V_i)=ve(V_j) e(Vi​)=ve(Vj​)

l(Vi)l(V_i)l(Vi​):表示事件 ViV_iVi​ 的最晚开始时间

该时间是指该活动的终点所表示事件的最迟发生时间与该活动所需时间之差。若边 <Vi,Vj><V_i,V_j><Vi​,Vj​> 表示活动 aia_iai​,则有如下公式
l(Vi)=vl(Vk)−wj,kl(V_i)=vl(V_k)-w_{j,k} l(Vi​)=vl(Vk​)−wj,k​

一个活动 aia_iai​ 的最迟开始时间 l(Vi)l(V_i)l(Vi​) 和其最早开始时间 e(Vi)e(V_i)e(Vi​) 的差额 d(i)=l(Vi)−e(Vi)d(i)=l(V_i) - e(V_i)d(i)=l(Vi​)−e(Vi​)

它是指该活动完成的时间余量,即在不增加完成整个工程所需总时间的情况下,活动 aia_iai​ 可以拖延的时间。若一个活动的时间余量为零,则说明该活动必须要如期完成,否则就会拖延完成整个工程的进度,所以称 l(Vi)−e(Vi)=0l(V_i) - e(V_i)=0l(Vi​)−e(Vi​)=0 即 l(Vi)=e(Vi)l(V_i)=e(V_i)l(Vi​)=e(Vi​) 的活动 aia_iai​ 是关键活动。

2.3 求关键路径的算法步骤
  1. 求 AOE 网中所有事件的最早发生时间 ve(Vi)ve(V_i)ve(Vi​)
  2. 求 AOE 网中所有事件的最迟发生时间 vl(Vi)vl(V_i)vl(Vi​)
  3. 求 AOE 网中所有活动的最早开始时间 e(Vi)e(V_i)e(Vi​)
  4. 求 AOE 网中所有活动的最迟开始时间l(Vi)l(V_i)l(Vi​)
  5. 求 AOE 网中所有活动的差额 d()d()d() ,找出所有 d()=0d()=0d()=0 的活动构成关键路径。

【数据结构-图】4.拓扑排序和关键路径(注解+原理)相关推荐

  1. 数据结构-----图的拓扑排序和关键路径算法

    部分图片取自:http://www.cnblogs.com/navorse/articles/1893863.html 在介绍拓扑排序和关键路径之前,先引入AOE网络的概念: 该图为一个AOE网,顶点 ...

  2. BUCT数据结构——图(拓扑排序、关键路径)

    文章目录 问题 A: 邻接矩阵存储的图,节点的出度和入度计算(附加代码模式) 问题 B: 算法7-12:有向无环图的拓扑排序 问题 C: 有向图是否存在环? 问题 D: 图-节点的最早发生时间 问题 ...

  3. C语言数据结构与算法---拓扑排序、关键路径

    文章目录 一. 有向无环图 二. 拓扑排序 1. 分析 2. 拓扑排序的定义及方法 3. 拓扑排序的重要应用 4. 拓扑排序的算法实现 三. 关键路径 1.分析 2. 什么是关键路径 3. 关键路径的 ...

  4. 拓扑排序和关键路径课程设计

    目录 1.    设计任务书... 3 1.1设计任务... 3 1.2程序功能... 3 1.3运行环境... 3 2.    本组课题... 3 2.1课题... 3 2.2本人任务... 3 3 ...

  5. 考研复习之数据结构笔记(十二)图(下)(图的应用,包含最小生成树、最短路径、拓扑排序、关键路径以及单元小结)

    目录 一.图的应用 1.1 最小生成树 (1)基本概念与问题引入 (2)Prim(普里姆)算法 (3)Kruskal(克鲁斯卡尔)算法 1.2 最短路径 (1)基本概念与问题引入 (2)Dijkstr ...

  6. 大话数据结构 第七章 图(二) 最小生成树、最短路径、拓扑排序、关键路径算法

    大话数据结构 第七章 图(二) 最小生成树.最短路径.拓扑排序.关键路径算法 最小生成树 定义 Prim算法 Kruskal算法 最短路径 Dijkstra算法 Floyd算法 拓扑排序 AOV网 拓 ...

  7. 拓扑排序和关键路径的图形化显示

    资源下载地址:https://download.csdn.net/download/sheziqiong/85883662 资源下载地址:https://download.csdn.net/downl ...

  8. 数据结构与算法之-----图(拓扑排序)

    [​​​​​​​ 写在前面的话:本专栏的主要内容:数据结构与算法. 1.对于​​​​​​​初识数据结构的小伙伴们,鉴于后面的数据结构的构建会使用到专栏前面的内容,包括具体数据结构的应用,所使用到的数据 ...

  9. 数据结构-考研难点代码突破 (C++实现有向无环图的拓扑排序)

    文章目录 1. AOV网 2. 拓扑排序 C++代码 1. AOV网 AOV网∶若用DAG 图(有向无环图)表示一个工程,其顶点表示活动,用有向边<Vi,Vj>表示活动 Vi必须先于活动V ...

  10. 超详细讲解实现拓扑排序、关键路径

    今天,小编带着大家来学习图中非常重要的一环,拓扑排序和关键路径! 目录 一. 绪论--实际应用 二. 拓扑排序 (一).含义 (二).实现原理 (三).代码实现 三. 关键路径 (一).含义 (二). ...

最新文章

  1. 广播搜寻服务器的动态IP
  2. ECharts的简单使用过程
  3. 以色列对话国际农民丰收节贸易会-万祥军:谋定无中生有
  4. 没有计算机的一天英语作文带翻译,初一英语作文我的一天带翻译
  5. 160805、oracle查询:取出每组中的第一条记录
  6. Python使用tkinter编写图片浏览程序
  7. ubuntu16.4 配置logstash6.3.2 kibanan6.3.2
  8. ARP过程——删除地址映射
  9. oracle 没有debug权限,开启Oracle的debug级别日志
  10. BizTalk database lookup funcatoid DbConnectionString 设定问题有解了
  11. .H264 .yuv格式文件下载还需要积分? 自己动手 ffmpeg几句命令轻松搞定
  12. 如何批量打印Word文件
  13. 帮忙写一篇关于消防化工指挥作战系统的设计报告
  14. 全球及中国游戏耳机市场运营模式分析及需求前景预测报告2022年版
  15. ppt怎么把图片做成翻书效果_手把手教你做图片翻书效果.ppt
  16. python实现文本查重系统_NLP之gensim库python实现文本相似度/匹配/查重
  17. 摄影测量与计算机视觉坐标系统转换和一些基本量的关系
  18. jQuery——简洁的javaScript库
  19. chartContrl 折线图添加报警线和一些其他设置 放大缩小折线图等
  20. excel VBA 行列的统计

热门文章

  1. 数据库字段设置为非空默认值
  2. JavaScript setTimeout函数
  3. AIR工程中发生This application cannot be run. (Error: invalid application identifier) 错误
  4. 很久没写东西了,留个言。
  5. stdthread(8)并发recursive_mutex 递归锁
  6. 跨链(5)“蚂蚁区块链”之预言机
  7. (chap5 web服务器) 保存资源的缓存
  8. D3ctf-D3MUG(u3d
  9. python基础高频_面试题(一)
  10. [architecture]-Armv8 Cryptographic Extension介绍