ACM学习笔记:拓扑排序与关键路径

title : 拓扑排序与关键路径
date : 2021-8-15
tags : ACM,图论

 

拓扑排序

对一个有向无环图G中所有顶点排成一个序列,使得图中任意一对顶点u和v,若边(u,v)属于E(G),那么u再线性序列中出现在v之前。这样的线性序列称为满足拓扑排序(Topological Order)的序列,简称拓扑序列。简单的说,由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序。

实现方法
//BFS:寻找入度为0的点,把这个点加入队列,在队列中对邻边进行删边操作,并反复这个操作直到所有点都被遍历。
Topological_sort(G){
   统计图G中每个点的入度(可计算重边,但不可计算自环),记为degree[i]
   初始化queue和result为空的队列,并将所有degree为0的点加入queue
   while (!queue.empty()){
       u = queue.pop() // 队首
       result.push(u)
       for e 是u的出边(若上面计算了重边,这里也要算,与上面一致)
       v是e的指向的点
       degree[v]--
       if (degree[v] == 0) queue.push(v)
  }
return result
}
//记忆化搜索:在每一个入度为0的点进行删边,然后往下搜索所有入度为0的点,直到遍历完所有节点。
calculate(u){
   if (u 已经搜索过) return table[u]
   ans = -inf
   for (v 是u的出边指向的点)
   ans = max(ans, value[u] + calculate(v))
   标记u已经搜索过
   table[u] = ans
   return ans
}
for (i 是G的所有节点)
result = max(result, calculate(i))
print(result)

 

关键路径

前面我们学到了拓扑排序

那么我们可以开始学关键路径了。

 

AOE网是边表示活动的网,是与AOV网相对应的概念。

而拓扑排序恰恰就是在AOV网上进行的,这是拓扑排序与关键路径最直观的联系。

关键路径(critical path):路径长度最长的路径。

 

ETV:Earliest Time Of Vertex

LTV:Latest Time Of Vertex

ETE:Earliest Time Of Edge

LTE:Lastest Time Of Edge

知道了ETV和LTV,就能推断出相应的ETE和LET。

 

拓扑排序的过程中,我们可以确定ve的值。从汇点反拓扑排序,就能求出vl的值。

 

关键活动:LTV==ETV的活动

关键活动所连成的路径就是关键路径。

 

求得了ETE与LTE之后只需要判断两者是否相等,如果相等则为关键路径中的一条边。

 

算法流程:

①拓扑排序获得每一个事件的最早发生时间ETV

②根据事件最早发生时间ETV推断事件的最晚发生时间LTV

③计算活动的最早于最晚发生时间

 

时间复杂度O(n+e)

 

参考资料

https://www.luogu.com.cn/blog/juruohyfhaha/post-ti-xie-su-dian

 

posted @ 2021-08-15 17:47  LINNO  阅读(438)  评论(0)    收藏  举报