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所有到达距离值符号取反,点权已经是正确的