Для даної 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]