特定のDAG(有向非巡回グラフ)の場合、そのトポロジーの並べ替えはすべての頂点の順列であり、DAGのすべてのエッジ(u、v)について、uは順列のvの前に表示されます。
あなたのタスクは、特定のDAGのトポロジカルソートの総数を計算することです。
ルール
- エンコーディングで有用な計算を行わない限り、隣接行列、隣接リスト、エッジリストなど、任意の形式を使用してグラフを表すことができます。有用な場合は、入力に頂点数や頂点リストなどを含めることもできます。
- 入力のグラフは常にDAGであると想定できます(サイクルはありません)。
- あなたのプログラムは理論的にはどんな入力に対しても機能するはずです。ただし、言語の基本的な整数型をオーバーフローすると失敗する可能性があります。
- 頂点の名前は、任意のタイプの任意の連続した値にすることができます。例:0または1から始まる数値(もちろん、この数値にコードを格納していない場合のみ)。
- これはコードゴルフです。最短のコードが勝ちます。
例
これは、異なる形式の同じ入力です。プログラムはそれらすべてを受け入れる必要はありません。頂点は常に0から始まる整数です。
Adjacency list:
[ [1 2 3 5] [2 4] [] [2] [] [3] ]
Adjacency matrix:
[ [0 1 1 1 0 1] [0 0 1 0 1 0] [0 0 0 0 0 0] [0 0 1 0 0 0] [0 0 0 0 0 0] [0 0 0 1 0 0] ]
Edge list:
6 [ [0 1] [0 2] [0 3] [0 5] [1 2] [1 4] [3 2] [5 3] ]
これは、この画像に示されているグラフです。
出力は次のようになります。
9
トポロジカルソートは次のとおりです。
[0 1 4 5 3 2]
[0 1 5 4 3 2]
[0 1 5 3 4 2]
[0 1 5 3 2 4]
[0 5 1 4 3 2]
[0 5 1 3 4 2]
[0 5 1 3 2 4]
[0 5 3 1 4 2]
[0 5 3 1 2 4]