Для данного DAG (направленного ациклического графа) каждый из его топологических сортов является перестановкой всех вершин, где для каждого ребра (u, v) в DAG, 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]