有向无环图
定义
边有向,无环.
英文名叫 Directed Acyclic Graph,缩写是 DAG.
性质
- 能 拓扑排序 的图,一定是有向无环图;
如果有环,那么环上的任意两个节点在任意序列中都不满足条件了.
- 有向无环图,一定能拓扑排序;
(归纳法)假设节点数不超过 𝑘k 的 有向无环图都能拓扑排序,那么对于节点数等于 𝑘k
的,考虑执行拓扑排序第一步之后的情形即可.
判定
如何判定一个图是否是有向无环图呢?
检验它是否可以进行 拓扑排序 即可.
当然也有另外的方法,可以对图进行一遍 DFS,在得到的 DFS 树上看看有没有连向祖先的非树边(返祖边).如果有的话,那就有环了.
应用
DP 求最长(短)路
在一般图上,求单源最长(短)路径的最优时间复杂度为 𝑂(𝑛𝑚)O(nm)(Bellman–Ford 算法,适用于有负权图)或 𝑂(𝑚log𝑚)O(mlogm)
(Dijkstra 算法,适用于无负权图).
但在 DAG 上,我们可以使用 DP 求最长(短)路,使时间复杂度优化到 𝑂(𝑛 +𝑚)O(n+m).状态转移方程为 𝑑𝑖𝑠𝑣 =𝑚𝑖𝑛(𝑑𝑖𝑠𝑣,𝑑𝑖𝑠𝑢 +𝑤𝑢,𝑣)disv=min(disv,disu+wu,v)
或 𝑑𝑖𝑠𝑣 =𝑚𝑎𝑥(𝑑𝑖𝑠𝑣,𝑑𝑖𝑠𝑢 +𝑤𝑢,𝑣)disv=max(disv,disu+wu,v)
.
拓扑排序后,按照拓扑序遍历每个节点,用当前节点来更新之后的节点.
---|---
参见:[DAG 上的 DP](../../dp/dag/).
* * *
> __本页面最近更新: 2026/1/7 08:56:54,[更新历史](https://github.com/OI-wiki/OI-wiki/commits/master/docs/graph/dag.md)
> __发现错误?想一起完善?[在 GitHub 上编辑此页!](https://oi-wiki.org/edit-landing/?ref=/graph/dag.md "edit.link.title")
> __本页面贡献者:[Ir1d](https://github.com/Ir1d), [Enter-tainer](https://github.com/Enter-tainer), [ouuan](https://github.com/ouuan), [Tiphereth-A](https://github.com/Tiphereth-A), [billchenchina](https://github.com/billchenchina), [dong628](https://github.com/dong628), [HeRaNO](https://github.com/HeRaNO)
> __本页面的全部内容在**[CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/deed.zh) 和 [SATA](https://github.com/zTrix/sata-license)** 协议之条款下提供,附加条款亦可能应用