系列文章目录
【必学要点!】图解Topo拓扑排序
目录
前言
无论是什么程序都要和数据打交道,一个好的程序员会选择更优的数据结构来更好的解决问题,因此数据结构的重要性不言而喻。数据结构的学习本质上是让我们能见到很多前辈在解决一些要求时间和空间的难点问题上设计出的一系列解决方法,我们可以在今后借鉴这些方法,也可以根据这些方法在遇到具体的新问题时提出自己的解决方法。(所以各种定义等字眼就不用过度深究啦,每个人的表达方式不一样而已),在此以下的所有代码都是仅供参考,并不是唯一的答案,只要逻辑上能行的通,写出来的代码能达到相同的结果,并且在复杂度上差不多,就行了。
一、AOE网的概念
1.什么是AOE网
在图中我们只关心两种结构:针对于顶点和针对于边的;而在上一篇文章(topo排序)中我们学习了什么是AOV网,AOV网就是针对于顶点(Vertices)的,而今天要学习的AOE网自然是针对于边(Edge)的;
在AOE网中,边表示活动,而顶点表示事件,边的权值表示活动持续的时间(针对于一个真实的工程);
2.源点和汇点
在构建的AOE网中,源点表示的入度为0的点;汇点(终点)表示 出度为0的点;
二、关键路径
1.概念
怎么理解关键路径中的“关键”的含义呢?这个“关键”是以工程结束为目标,举个例子吧,比如你在造火箭,众所周知火箭有很多的部件,而每个部件的制造的时间有块有慢,我们想要让火箭起飞,就肯定要等最慢的部件造完才能够组装,不然火箭一飞就爆炸了啊;
所以在关键路径中,我们要找的是从源点到汇点,路径最长的路径;
2.事件最早发生时间、事件最晚发生时间
有如下一个带权有向图;
1、事件最早发生时间ETV,即顶点的最早发生时间:事件的最早发生时间一定是从源点开始计算;
就比如以顶点V2为例:V2事件最早发生时间为6,表示在活动a1完成之后V2才可以开始;如果以V6为例,那么V6的事件最早发生时间是5+2=7;
2、事件最晚发生时间LTV 如果超出这个时间,就会耽误工期;
从图中我们其实可以看出 V1 到 V9 的总时间(权值之和)是18,那么从V2过后需要1+9+2=12的时间才能完成工程(到汇点),那么总时间减去这个时间就表示v2的最晚发生时间,不满足这个最晚发生时间就会耽误工期,即LTV=18-12=6;由此还可以得到:对于关键路径上的节点而言,最晚发生时间 和 最早发生时间相等;
如果以V6为例,V6的最晚发生时间为18-(4+4)=10,也就是说只要V6的最晚发生时间不超过10(V6的事件最早发生时间为7,那么V6还可以有至少3天的摸鱼时间)就不会耽误工期;
3.活动最早开工时间、活动最晚开工时间
3、活动的最早开始时间ETE 和 事件的最早发生时间一致;
以边a9为例:a9的最早开工时间 与 V6的最早发生时间一致,即等于7;
4、活动最晚开工时间LTE=事件最晚发生时间-活动本身的时间(权值)
边a4的最晚开工时间 = 事件V5的最晚发生时间 - 活动a4的时间 = 7-1=6;
三、逻辑实现
求关键路径过程其实就是计算上述的四个时间;通过事件最早发生时间、事件最晚发生时间来求出活动的时间,而活动最早开工时间、活动最晚开工时间才是我们需要输出的;
1.创建图
我们还是以上文中的有向带权图为例,建立图的结构;这里我们一是需要