TopologicalSort 拓扑排序

问题

对有向图DGDG进行拓扑排序。

解法

拓扑排序是深度优先搜索的典型应用。

遍历有向图DGDG的所有顶点做DFS搜索。对任意顶点viv_i做DFS搜索,直到无法继续搜索为止,搜索到的顶点数量即为viv_i的DFS距离did_i。将所有顶点按照其DFS距离从大到小排序,即为所有顶点的拓扑排序。一个顶点的DFS距离至少为11

对下图中的有向图DGDG进行拓扑排序:

(1)(1) 顶点00的DFS距离为d0=8d_0 = 8,DFS搜索顺序为[0,1,2,4,6,7,3,5][0, 1, 2, 4, 6, 7, 3, 5],如下图;

(2)(2) 顶点11的DFS距离为d1=6d_1 = 6,DFS搜索顺序为[1,2,4,6,7,3][1, 2, 4, 6, 7, 3],如下图;

(3)(3) 顶点22的DFS距离为d2=4d_2 = 4,DFS搜索顺序为[2,4,6,7][2, 4, 6, 7],如下图;

(4)(4) 顶点33的DFS距离为d3=5d_3 = 5,DFS搜索顺序为[3,2,4,6,7][3, 2, 4, 6, 7]

(5)(5) 顶点44的DFS距离为d4=3d_4 = 3,DFS搜索顺序为[4,6,7][4, 6, 7]

(6)(6) 顶点55的DFS距离为d5=7d_5 = 7,DFS搜索顺序为[5,1,2,4,6,7,3][5, 1, 2, 4, 6, 7, 3]

(7)(7) 顶点66的DFS距离为d6=1d_6 = 1,DFS搜索顺序为[6][6]

(8)(8) 顶点77的DFS距离为d7=1d_7 = 1,DFS搜索顺序为[7][7]

最终得到拓扑排序[0,5,1,3,2,4,6,7][0, 5, 1, 3, 2, 4, 6, 7]

每个顶点DFS搜索的时间复杂度为O(V)O(\| V \|),拓扑遍历的时间复杂度为O(V2)O(\| V \| ^ 2)

Introduction To Algorithms

源码

TopologicalSort.h

TopologicalSort.cpp

测试

TopologicalSortTest.cpp

Last updated