这篇博客的缘起是女鹅问的一道AOE网的题,然而上一波数据结构并没有全看完就莫名搁置了,当时看图的后半部分算法很多,想着实现一下,一直静不下心搞,就无限期搁置了(叹气,戴起老花镜开始研究= =
题目
牛客网上此题的讨论
在这个讨论区看到了五花八门的答案,陷入沉思,决定自己实现一下AOE网求关键活动。
动手实现
-
首先看看这个算法详细的流程
- 拓扑排序有删边、dfs两种实现,下面实现的是删边法(dfs有空再补吧
严格按照算法的步骤实现如下
#include
#include
#include
#include
#include
正解
回到wikipedia上对整体工期的解释,它应当是源点到汇点最长路径的长度,所以要缩短工期,就是要减少最长路径(关键路径)的长度。
源点到汇点的路径&总长度:
-
1 —— 2 —— 4 —— 6
18
-
1 —— 2 —— 5 —— 6
18
-
1 —— 3 —— 5 —— 6
27
-
1 —— 3 —— 2 —— 4 —— 6
27
-
1 —— 3 —— 2 —— 5 —— 6
27
后面三条为关键路径,只需找出能同时缩短他们三个的边即可。
其实答案有很多种,因为除了1——2都是关键活动 = =
缩短1——3可以缩短全部三条,缩短3——2可以缩短后两条,缩短5——6可以缩短第一和第三条(省略blabla)
看选项,发现只有C满足同时缩短三条关键路径,即缩短了最长路径 #
至此,终于清爽的八达鸟~