引用元:トポロジカルソート可能かを判定 (paizaランク A 相当)

トポロジカルソートとは

有向グラフ G について、下図のようにすべての辺が同じ方向になるように頂点を一列に並べることを「トポロジカルソート」といいます。

トポロジカルソートはすべての有向グラフについて可能という訳ではありません。

トポロジカルソートの利用例

トポロジカルソートはどのようなときに利用されるのでしょうか? 典型的な例としてジョブのスケジューリングがあります。頂点Xから頂点Yへの辺はジョブXが終了しなければジョブYを始められないということを意味しているとします。この場合、ジョブをトポロジカルソートすることによりジョブに着手すべき順番がわかることになります。

またコンピュータサイエンスでの利用例として命令スケジューリング、表計算で式を変更したとき再計算が必要なセルの評価順序の決定、論理合成、Makefileで指定されたファイルのコンパイル順序の決定、リンカのシンボル依存関係の解決などがあります。

トポロジカルソート可能の必要十分条件

トポロジカルソートが可能であるための必要十分条件は、「入次数が 0 の頂点とその頂点から出ている辺を削除する操作を繰り返すことですべての頂点を削除することができる」です。

実際にこの操作をやってみてすべての頂点を削除できればトポロジカルソートは可能です。そして頂点を削除した順番がそのままトポロジカルソートされた頂点の順番となります。トポロジカルソートの結果は1とおりとは限りません。

C#で実装してみる

それではC#で実装してみましょう。全図のもの(頂点番号は0スタートにしているので番号が1つだけズレている)をトポロジカルソートできるか試してみます。

実行結果

図とは異なる結果になりましたが、これもトポロジカルソートの解になっています。

JavaScriptでも実装してみる

誰でも動作確認ができるようにJavaScriptでも実装してみます。

index.js