如果您正在寻找topological sort
,您也可以这样做,给定一个邻接列表(或(u,v)
您可以及时预处理的边列表O(E)
):
list top_sort( graph in adjacency list )
parent = new list
queue = new queue
for each u in nodes
parent(u) = number of parents
if ( parent(u) is 0 ) // nothing points to node i
queue.enqueue( u )
while ( queue is not empty )
u = queue.pop
add u to visited
for each edge ( u, v )
decrement parent(v) // children all have one less parent
if ( parent(v) is 0 )
queue.enqueue( v )
给定一个adjacency list
(或边缘列表(u,v)
),这是O( V + E )
因为每个边缘被触摸两次 - 一次递增,一次递减,O(1)
每次都及时。对于普通队列,每个顶点最多也将被队列处理两次——这也可以在O(1)
标准队列中完成。
请注意,这与 DFS(至少是直接实现)的不同之处在于它处理森林。
另一个有趣的注意事项是,如果你queue
用某种priority_queue
强加的结构/排序代替,你实际上可以返回按某种顺序排序的结果。
例如,对于一个规范的类依赖图(如果你选择了 Y 类,你只能选择 X 类):
100:
101: 100
200: 100 101
201:
202: 201
结果,您可能会得到:
100, 201, 101, 202, 200
但是如果你改变它以便你总是想先上编号较低的课程,你可以很容易地把它改成返回:
100, 101, 200, 201, 202