问题
对有向图DG进行拓扑排序。
解法
拓扑排序是深度优先搜索的典型应用。
遍历有向图DG的所有顶点做DFS搜索。对任意顶点vi做DFS搜索,直到无法继续搜索为止,搜索到的顶点数量即为vi的DFS距离di。将所有顶点按照其DFS距离从大到小排序,即为所有顶点的拓扑排序。一个顶点的DFS距离至少为1。
对下图中的有向图DG进行拓扑排序:
(1) 顶点0的DFS距离为d0=8,DFS搜索顺序为[0,1,2,4,6,7,3,5],如下图;
(2) 顶点1的DFS距离为d1=6,DFS搜索顺序为[1,2,4,6,7,3],如下图;
(3) 顶点2的DFS距离为d2=4,DFS搜索顺序为[2,4,6,7],如下图;
(4) 顶点3的DFS距离为d3=5,DFS搜索顺序为[3,2,4,6,7];
(5) 顶点4的DFS距离为d4=3,DFS搜索顺序为[4,6,7];
(6) 顶点5的DFS距离为d5=7,DFS搜索顺序为[5,1,2,4,6,7,3];
(7) 顶点6的DFS距离为d6=1,DFS搜索顺序为[6];
(8) 顶点7的DFS距离为d7=1,DFS搜索顺序为[7];
最终得到拓扑排序[0,5,1,3,2,4,6,7]。
每个顶点DFS搜索的时间复杂度为O(∥V∥),拓扑遍历的时间复杂度为O(∥V∥2)。
Introduction To Algorithms
源码
TopologicalSort.h
TopologicalSort.cpp
测试
TopologicalSortTest.cpp