红魔咖啡馆

头发越掉越多,头发越掉越少

0%

【CS61B】Lec26 Directed Acyclic Graphs

Lec26 Directed Acyclic Graphs

拓扑排序

思路

假设有一系列任务编号由A到H,v->w表示v必须发生在w之前,则我们需要一个算法来找到一个合适的任务执行顺序

如该图,顺序如ACBDFEHG或CADFBEGH都是合理的

我们的解决方法是使用dfs遍历每个入度为0的顶点而不清除每次遍历中的标记

  • 按回溯顺序记录dfs结果
  • 将结果反转,即为拓扑序

从哪里开始?

注意,实际上并不需要寻找入度为0的顶点的这一操作,实际可以进行如下操作

  • 从任意一个顶点开始
  • 若没有全被标记,则选择一个未被标记的再进行dfs
  • 直到全部被标记

限制

拓扑排序只存在于有向无环图(DAG)

DAG上的最短路

对于负边权,使用Dijkstra算法在松弛时会失效

在DAG上,我们可以使用拓扑序来跑最短路

时间复杂度:\(O(V+E)\)

最长路

寻找最长路已知最佳算法是指数级的

  • 拷贝一份已知图G‘,将边权取负
  • 在图G’上跑一遍最短路,得到结果X
  • 将X中1所有到达距离值符号取反,点权已经是正确的