在一些任务安排和调度的问题里,不同的问题或者任务之间存在一些依赖关系:有的任务需要在某些任务完成之后才能做。像一些学校的教学课程安排:设置某一门课程需要依赖于一个前置的课程,只有学生学习了前置课程之后才能去学习该课程,如果将一门课程当做一个节点,从它引出一个指针指向后序依赖它的课程,就会得到一个有向图。对于这种图来说,最大的特点就是它们肯定就不能存在环,不然就有逻辑上的错误。因此,前面检测一个图是否为DAG的方法就是看图中是否有环。拓扑排序则是在确定没有环的情况下,输出一个正常的序列,这个序列表示从一个不依赖任何元素的节点到后序的节点(这些序列正好符合课程安排或者任务调度的逻辑顺序)。对于一个有向图来说,如果它不存在环,则它应该为DAG。现在的问题是怎么找出这个拓扑序列来?基于DFS,结合堆栈的拓扑排序证明:假设对某一已知有向无回路图$G=(V,E)$运行DFS过程,以便确定其顶点的完成时刻。只要证明对任一对不同顶点$u、v∈V$,若$G$中存在一条从$u$到$v$的边,则$finish[v] \lt finish[u]$。考虑过程DFS所探寻的任何边$(u,v)$,当探寻到该边时,顶点$v$必然是已考察完成的顶点或者还未被访问到的顶点:①若$v$是还未被访问到的顶点,则它是$u$的后裔,$finish[v] \lt finish[u]$;②若$v$为已考察完成的顶点,则已完成探索,且$finish[v]$已经设置了。因为仍在探寻$u$,还要为$finish[u]$赋时间戳,同样有$finish[v] \lt finish[u]$。这样一来,对于有向无回路图中任意边$(u, v)$,都有$finish[v]