图论的最后一部分是关键路径,我们简单了解一下。关键路径是在拓扑排序基础上进行的。
拓扑排序解决工程项目能否顺利进行,解决活动间的依赖问题;而关键路径解决工程完成的时间。这里提出一个AOE网络(Activity on Edge),即顶点代表事件,边代表活动,权重代表活动持续时间。
二者的关系就是:AOV网只能表示活动之间的制约关系,边表示活动之间的依赖,没有权重,而AOE网可以用权值表示活动的持续时间。所以AOE网是建立在活动之间制约关系没有矛盾的基础上,再来分析整个工程需要多少时间。
在AOE网中,从始点到终点具有最大路径长度(该路径上的各个活动所持续的时间之和)的路径为关键路径。
关键路径(CriticalPath)算法的主要思想:
这里可以参考下面几篇博客详解关键路径算法,理解四个变量的含义和求解方法,再找出关键路径
前提是四个重要的概念、变量
(1)事件最早开始时间etv(earlist time of vertex):顶点k的最早发生时间
(2)事件最晚开始时间ltv(latest time of vertex) :顶点k的最晚发生时间,超过此时间,会延误整个工期
(3)活动最早开始时间ete(earlist time of edge):弧a的最早发生时间
(4)活动最晚开始时间let(latest time of edge) :弧a的最晚发生时间,就是不推迟工期的最晚开始时间
求解方法:
第一步先拓扑排序,再依次求解这四个变量。
结合上面的博客中一些图示理解,etv 按拓扑排序顺序遍历所有顶点,初始时间0,父顶点的时间+边的权重,取极大值;ltv 按拓扑排序逆序遍历,初始时间为终点的时间,向前减去边的权重;
最后我们遍历所有顶点及邻接边,求每条边(活动)的ete 和 let ,重点来了,取ete(i)=let(i)的边即为关键路径上的边(关键路径可能不止一条)。
详细的参考大神的博客即可,有兴趣的实现一下。LeetCode中关键路径题目没注意到,理解算法的核心思想点到为止也是不错的。