Dla danego DAG (ukierunkowanego wykresu acyklicznego) każdy z jego rodzajów topologicznych jest permutacją wszystkich wierzchołków, gdzie dla każdej krawędzi (u, v) w DAG u występuje przed v w permutacji.
Twoim zadaniem jest obliczenie całkowitej liczby rodzajów topologicznych danego DAG.
Zasady
- Możesz użyć dowolnego formatu do przedstawienia wykresu, takiego jak macierz przylegania, lista przylegania lub lista krawędzi, o ile nie wykonasz przydatnych obliczeń w kodowaniu. Na wejściu można także umieścić takie elementy, jak liczba wierzchołków lub lista wierzchołków, jeśli są one przydatne.
- Możesz założyć, że wykres na wejściu jest zawsze DAG (nie ma żadnych cykli).
- Twój program powinien działać teoretycznie dla każdego wejścia. Ale może się nie powieść, jeśli przepełni podstawowy typ liczb całkowitych w twoim języku.
- Nazwy wierzchołków mogą być dowolnymi kolejnymi wartościami dowolnego typu. Na przykład: liczby zaczynające się od 0 lub 1. (I oczywiście tylko wtedy, gdy nie zapisujesz kodu w tym numerze).
- To jest golf golfowy. Najkrótszy kod wygrywa.
Przykład
To samo wejście w różnych formatach. Twój program nie musi akceptować wszystkich. Wierzchołki są zawsze liczbami całkowitymi zaczynającymi się od 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] ]
Jest to wykres pokazany na tym obrazku:
Dane wyjściowe powinny być:
9
Rodzaje topologiczne to:
[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]
code-golf
combinatorics
graph-theory
permutations
jimmy23013
źródło
źródło
Odpowiedzi:
CJam - 25
Z wielką pomocą od user23013 :)
Wypróbuj online
Wyjaśnienie:
Ogólny algorytm jest taki sam jak w rozwiązaniu Python firmy xnor .
Kluczem jest tutaj
j
operator, który dokonuje zapamiętywania rekurencji. Pobiera parametr, wartość lub tablicę dla wartości początkowych (jak w f (0), f (1) itd.) I blok do zdefiniowania rekurencji.j
Operator jest ponownie wykorzystywane wewnątrz bloku robi rekurencyjnych (i memoized) połączenia do tego samego bloku. Można go również używać z wieloma parametrami, ale tutaj tak nie jest.Wielką innowacją użytkownika user23013 jest użycie j z różnymi typami danych, wykorzystując listę sąsiedztwa jako tablicę wartości początkowych.
źródło
Python, 58
Dane wejściowe składają się ze słownika przylegania
G
i zestawu wierzchołkówV
.Kod jest rekurencyjny. Zestaw
V
przechowuje wszystkie węzły, które nadal wymagają odwiedzin. Dla każdego potencjalnego następnego węzła sprawdzamy jego przydatność, sprawdzając, czy żadne pozostałe wierzchołki nie wskazują na niego,V-G[v]==V
sprawdzając toV
i czyG[v]
są rozłączne. Dla wszystkich odpowiednich takich wierzchołków dodajemy liczbę rodzajów topologicznych po usunięciu. W podstawowym przypadku pusty zestaw daje 1.źródło
Mathematica,
805751 bajtówBardzo proste wdrożenie definicji. Właśnie generuję wszystkie permutacje i liczę, ile z nich jest poprawnych. Aby sprawdzić, czy permutacja jest poprawna, otrzymuję wszystkie pary wierzchołków w permutacji. Dogodnie
Subsets[l,{2}]
nie tylko daje mi wszystkie pary, ale także utrzymuje porządek, w którym się znajdująl
- dokładnie to, czego potrzebuję.Powyżej jest funkcja, która oczekuje listy wierzchołków i listy krawędzi, jak
jeśli wywołasz funkcję
f
.Spróbuję zagrać w golfa, a może później zastosuję inne podejście.
źródło
Pyth, 27 bajtów
Definiuje funkcję 2 wejść,
g
. Pierwsze wejście to liczba wierzchołków, drugie to lista skierowanych krawędzi.Testować:
Wypróbuj tutaj.
źródło
^UGG
, które generuje wszystkieG
listy wpisówrange(len(G))
.[0, 1, ...]
bezpośrednio w danych wejściowych?^GlG
vs.^UGG
.Haskell,
1021071008985 bajtówDane wejściowe to najwyższa liczba wierzchołków (zaczynająca się od 0) i lista krawędzi, gdzie krawędź jest listą dwóch elementów. Przykład użycia:
5 # [[0,1], [0,2], [0,3], [0,5], [1,2], [1,4], [3,2], [5,3]]
Jak to działa: policz wszystkie permutacje
p
wierzchołków, dla których[u,v]
spełniają wszystkie krawędzie : pozycjau
inp
jest mniejsza niż pozycjav
inp
. To bezpośrednie wdrożenie definicji.Edycja: moja pierwsza wersja zwróciła same rodzaje topologiczne, a nie ich liczbę. Naprawione.
Edycja II: nie działał dla wykresów z niepołączonymi wierzchołkami. Naprawione.
źródło