参考资料及图片来源:《算法导论》P355-356
图的表示、深度优先搜索、广度优先搜索等先验知识。
拓扑排序
1 定义
对于一个有向无环图 G = ( V , E ) G=(V, E) G=(V,E)来说,其拓扑排序是 G G G中所有节点的一种线性次序,该次序满足条件:如果图 G G G包含边 ( u , v ) (u, v) (u,v),则节点 u u u在拓扑排序中处于节点 v v v前面。
可以将图的拓扑排序看作是将图的所有节点在一条水平线上排开,图的所有有向边从左指向右。
2 一个例子
下图给出了Bumstead教授(别管他是谁了)每天早上起床穿衣的一个次序图。图中可以很清楚地看到教授穿衣的一个优先次序。必须穿上某些衣服后才能穿其他衣服(先穿内裤才能套裤子)。有些衣服可以以任意顺序穿上(先穿袜子和先穿内裤没什么区别)。
这就是一个有向无环图,有向边 ( u , v ) (u, v) (u,v)表明服装 u u u必须在服装 v v v之前穿上。对该有向无环图进行拓扑排序所获得的就是一种合理穿衣的次序。
下图就是对上面图进行拓扑排序后的结果,将排序后的图放在一条水平线上展示出来,在该水平线上,所有的有向边都从左指向右。所有节点按照其完成时间的逆序排列。
3 伪代码
通过深度优先搜索可以实现拓扑排序,如上图,节点次序为完成时间的逆序
T O P O L O G I C A L − S O R T ( G ) TOPOLOGICAL-SORT(G) TOPOLOGICAL−SORT(G):对有向无环图进行拓扑排序。
call DFS(G) to compute finishing times v.f for each vertex v
as each vertex is finished, insert it onto thefront of a linked list
return the linked list of vertices
4 Leetcode练习
下面的题目可以用来练习拓扑排序。