AOV网络与拓扑排序

活动网络可以用来描述生产计划、施工过程、生产流程、程序流程等工程中各子工程的安排问题。活动网络可分为两种:AOV 网络和 AOE 网络。

1. AOV 网络与有向无环图 

一般一个工程可以分成若干个子工程,这些子工程称为活动。完成了这些活动,整个工程就完成了。实际上,可以用有向图来表示一个工程。在这种有向图中,用顶点表示活动,用有向边<u, v>表示活动 u 必须先于活动 v 进行。这种有向图叫做顶点表示活动的网络,记作 AOV 网络。 

AOV 网络中,如果存在有向边<u, v>,则活动 u 必须在活动 v 之前进行,并称 u v 的直接前驱 v u 的直接后继如果存在有向路径<u, u1, u2, …, un, v>,则称 u v 的前驱, v u 的后继。 

AOV 网络中不能出现有向回路(或称为有向环)。不含有向回路的有向图称为有向无环图

AOV 网络中如果出现了有向回路,则意味着某项活动以自己作为先决条件,这是不对的。如果设计出这样的流程图,工程将无法进行。对于程序而言,将陷入死循环。因此,对于给定的AOV 网络,必须先判断它是否是有向无环图。 

2. 拓扑排序 

判断有向无环图的方法是对 AOV 网络构造它的拓扑有序序列,即将各个顶点排列成一个线性有序的序列, 使得 AOV 网络中所有存在的前驱和后继关系都能得到满足。 

构造 AOV 网络全部顶点的拓扑有序序列的运算称为拓扑排序。如果通过拓扑排序能将 AOV 网络的所有顶点都排入一个拓扑有序的序列中,则该 AOV 网络中必定不存在有向环;相反,如果得不到所有顶点的拓扑有序序列,则说明该 AOV 网络中存在有向环,此AOV 网络所代表的工程是不可行的。 

3. 拓扑排序实现方法

对一个 AOV 网络进行拓扑排序的方法为:

  • AOV 网络中选择一个入度为 0(即没有直接前驱)的顶点并输出;
  • AOV 网络中删除该顶点及该顶点发出的所有边;
  • 重复步骤(1)(2),直至找不到入度为 0 的顶点。

按照上面的方法进行拓扑排序,其结果有两种情形:第一种,所有的顶点都输出来了,也就是整个拓扑排序完成了;第二种,仍有顶点没有输出,但剩下的图中再也没有入度为 0 的顶点,拓扑排序不能再继续进行下去了,这就说明此图是有环图。下图给出了一个拓扑排序的例子,最后得到的拓扑有序序列为: C5, C1, C4, C3, C2, C6。在该图中,有阴影的顶点表示当前输出的顶点。其拓扑排序过程为:

  • 选择一个入度为0的顶点, C5,如图(b)所示,删除C5及发出的每条边;
  • 选择一个入度为0的顶点, C1,如图(c)所示,删除C1及发出的每条边;
  • 选择一个入度为0的顶点, C4,如图(d)所示,删除C4C4没有出边;
  • 选择一个入度为0的顶点, C3,如图(e)所示,删除C3及发出的每条边;
  • 选择一个入度为0的顶点, C2,如图(f)所示,删除C2及发出的每条边;
  • 选择一个入度为0的顶点, C6,如图(g)所示,删除C6C6没有出边。

至此,拓扑排序执行完毕,所有顶点都排在一个线性有序的序列中。 

 

posted @   小熊酱  阅读(83)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示