[Data Structure & Algorithm] 有向无环图的拓扑排序及关键路径

基本名称

  • 有向无环图 - DAG (Directed Acycline Graph)
    • 如果图的邻接矩阵中,对角线以上(或以下)均为零,则说明该有向图为无环图;反之,不一定成立
  • 顶点表示的活动网 - AOV网 (Activity On Vertex Network)
    • 弧上没有权值
    • 通常用于表示流程图
  • 弧表示的活动网 - AOE网 (Activity On Edge)
    • 弧上的权值 - 活动持续的时间
    • 通常用于估算工程完成的时间
    • 正常情况下(无环),图中只有一个入度为0的点(源点)和一个出度为0的点(汇点)
  • 弧尾 - 在结点A指向结点B的弧中,结点A为弧尾
  • 图中的结点数量 - n; 图中的弧数量 - e

拓扑排序 - 基于AOV网

  • 分类
    • 全序 - 拓扑有序
      • 集合中所有结点都可比较(经过零个或多个结点后可连接)
    • 偏序 - 只有部分结点是可比较的
  • 可以求拓扑排序的图中不存在环
  • 基本思想
    1.遍历图中没有前驱(入度为0)的结点
    2.选择并输出一个没有前驱的结点,循环与之相连的结点
    3.删除该结点,和以该顶点作为弧尾的弧
    4.如果下一结点为空,则重复2,3,直到所有结点均已全部输出(如果图中还存在有前驱的结点,则说明图中存在环)
  • 具体实现
    • 结点结构 - 数据域(结点的值)|链域(指向下一个结点)|数据域(结点的入度)
    • 引入栈
      • 初始化 - 遍历所有结点,保存所有入度为0的结点
      • 如果在输出结点并删除弧之后,有新增的入度为0的结点,再压入栈中
    • 时间复杂度O(n+e)

关键路径 - 基于AOE网

  • 定义
    • ve(i) - 事件i的最早开始时间
    • vl(i) - 事件i的最晚开始时间
    • 关键路径 - 长度最长的路径
    • 关键活动 - 关键路径上的所有活动,ve(i) = vl(i)
  • 求解关键路径需要在拓扑有序和逆拓扑排序的前提下进行,即图中也不能存在环
  • 基本思路
    1.从源点vi出发,令ve(i) = 0,按拓扑有序求ve(j),取路径中的最大值
    2.从汇点vn出发,在汇点上ve(n) = vl(n),按逆拓扑有序求vl(j),取路径中的最小值
    3.所有ve(i)=vl(i)的点都是关键活动,其相连即为关键路径
  • 具体实现
    • 逆拓扑有序 - 将拓扑排序的序列存储在栈中,再将栈中元素弹出,即可得到逆拓扑排序
  • 什么情况下,提高关键活动,才能对工程的进度产生影响
    • 提高关键活动可能导致关键路径的改变,所以必须在关键路径不变的前提下
    • 关键活动必须在所有关键路径上
posted @ 2018-10-15 21:17  break大蜗牛  阅读(335)  评论(0编辑  收藏  举报