を探している場合は、隣接リスト(または時間内に前処理できるエッジのリスト)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 )
、各エッジが2回タッチされるためです。1回はインクリメント、1回はデクリメントしますO(1)
。通常のキューでは、各頂点もキューによって最大2回処理されます。これはO(1)
、標準のキューでも実行できます。
これは、フォレストを処理するという点でDFS(少なくとも単純な実装)とは異なることに注意してください。
もう1つの興味深い注意点は、ある種の構造/順序を課すことで置き換えるqueue
と、実際にある順序でソートされた結果を返すことができるということです。priority_queue
たとえば、正規のクラス依存関係グラフの場合(クラスYを取得した場合にのみクラスXを取得できます):
100:
101: 100
200: 100 101
201:
202: 201
結果として、おそらく次のようになります。
100, 201, 101, 202, 200
ただし、常に小さい番号のクラスを最初に取得するように変更した場合は、次のように簡単に変更できます。
100, 101, 200, 201, 202