Definition
DAG 有向无环图
若一个有向图中不存在环,则称为有向无环图(DAG,Directed-Acyclic-Graph)
AOV 网
若用有向无环图表示一个工程,其顶点表示活动,用有向边 < V i , V j > <V_{i},V_{j}> <Vi,Vj> 表示活动 V i V_{i} Vi 必须先于活动 V j V_{j} Vj 这样的一种关系,则称这样的DAG为顶点表示活动的网络(AOV,Activity On Vertex Network)。顶点之间的前驱和后继关系具有传递性,但不具有自反性
Topological Sort 拓扑排序
由DAG的顶点组成的序列为一个拓扑排序,则:
- 每个顶点有且只有出现一次
- 若 A A A 在 B B B 前面,则图中不存在从 B B B 到 A A A 的路径
即,拓扑排序是对有向无环图顶点的排序,每个DAG拥有一个或者多个拓扑排序。通常:
- 从DAG图中找到一个入度为 0 0 0 的顶点输出,并将其以及与其相关的出边从图中除外
- 不断重复这个过程,直到将所有顶点输出为止
可以想象,对于一个有向无环图来说,当我们将当前入度为 0 0 0 的顶点(可能不止一个)及其相关的出边除外之后,与其相关的后继顶点的出度减少,由于没有环的存在,即顶点的入度只与其直接前驱相关,那么将没有前驱的顶点除外之后,必然产生新的顶点,这个或这些顶点的入度为 0 0 0,此时这些顶点在有向无环图中的优先级并列最高。通过不断重复这样的过程——即每次都把当前优先级最高的顶点(显然这很有可能不止一个)除外,事实上就是按照顶点的优先级顺序将顶点输出,得到的就是有向无环图中顶点的优先级序列,即我们的拓扑排序
但是需要注意:
- 结果通常不唯一(比如初始顶点入度为 0 0 0 的顶点有多个);但是如果已经线性有序,那么显然结果是唯一的,因为每个顶点的直接前驱和直接后继都是确定的(如果有)
- 根据拓扑排序进行顶点重新编号,可以将得到的新的DAG图用上三角矩阵存储起来(格),所以通常对于邻接矩阵是三角矩阵的图存在拓扑排序,但是反之却不一定成立(需要对顶点重新排序)
Performance
删除顶点同时加上删除这个顶点的边,所以时间复杂度总共为 O ( ∣ V ∣ + ∣ E ∣ ) O(|V|+|E|) O(∣V∣+∣E∣)