有向无环图
定义
边有向,无环。
英文名叫 Directed Acyclic Graph,缩写是 DAG。
性质
-
能 拓扑排序 的图,一定是有向无环图;
如果有环,那么环上的任意两个节点在任意序列中都不满足条件了。
-
有向无环图,一定能拓扑排序;
(归纳法)假设节点数不超过 \(k\) 的 有向无环图都能拓扑排序,那么对于节点数等于 \(k\) 的,考虑执行拓扑排序第一步之后的情形即可。
判定
如何判定一个图是否是有向无环图呢?
检验它是否可以进行 拓扑排序 即可。
当然也有另外的方法,可以对图进行一遍 DFS,在得到的 DFS 树上看看有没有连向祖先的非树边(返祖边)。如果有的话,那就有环了。
应用
DP 求最长(短)路
在一般图上,求单源最长(短)路径的最优时间复杂度为 \(O(nm)\)(Bellman-Ford 算法,适用于有负权图)或 \(O(m \log m)\)(Dijkstra 算法,适用于无负权图)。
但在 DAG 上,我们可以使用 DP 求最长(短)路,使时间复杂度优化到 \(O(n+m)\)。状态转移方程为 \(dis_v = min(dis_v, dis_u + w_{u,v})\) 或 \(dis_v = max(dis_v, dis_u + w_{u,v})\)。
拓扑排序后,按照拓扑序遍历每个节点,用当前节点来更新之后的节点。
C++ | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
|
参见:DAG 上的 DP。
本页面的全部内容在 小熊老师 - 莆田青少年编程俱乐部 0594codes.cn 协议之条款下提供,附加条款亦可能应用