Celem tego wyzwania jest skończony ukierunkowany wykres acykliczny (DAG), określenie, czy wykres jest redukcją przechodnią .
Krótkie wyjaśnienie, czym są DAG i redukcje przechodnie:
DAG jest wykresem z ukierunkowanymi krawędziami (tzn. Na tej krawędzi można podróżować tylko w jednym kierunku), tak że biorąc pod uwagę dowolny węzeł początkowy na wykresie, nie można powrócić do węzła początkowego (tzn. Nie ma cykli).
Biorąc pod uwagę dowolny węzeł początkowy, jeśli możliwe jest przejście do innego węzła końcowego na wykresie za pomocą dowolnej dodatniej liczby krawędzi, wówczas ten węzeł końcowy jest definiowany jako osiągalny z węzła początkowego. W ogólnym DAG może istnieć wiele ścieżek, które można wziąć z węzła początkowego do docelowego węzła końcowego. Na przykład weź ten wykres diamentów:
Aby dostać się do węzła D
z A
, można podjąć ścieżkę A->B->D
lub A->C->D
. W ten sposób D
jest osiągalny z A
. Jednak nie ma ścieżki, którą można by dostać się do węzła B
zaczynając od węzła C
. Zatem węzeł B
nie jest osiągalny z węzła C
.
Zdefiniuj osiągalność wykresu jako listę osiągalnych węzłów dla każdego początkowego węzła na wykresie. Tak więc dla tego samego przykładowego wykresu diamentów osiągalność jest następująca:
A: [B, C, D]
B: [D]
C: [D]
D: []
Inny wykres, który ma taką samą osiągalność jak powyższy wykres, pokazano poniżej:
Jednak ten drugi wykres ma więcej krawędzi niż oryginalny wykres. Przejściowa redukcja wykresu to wykres z najmniejszą liczbą krawędzi i taką samą osiągalnością jak oryginalny wykres. Tak więc pierwszy wykres jest przechodnią redukcją drugiego.
W przypadku skończonego DAG gwarantowane jest, że redukcja przechodnich istnieje i jest unikalna.
Wejście
Dane wejściowe to „lista list”, gdzie lista zewnętrzna ma długość liczby wierzchołków, a każda lista wewnętrzna jest długością liczby krawędzi wychodzących z powiązanego węzła i zawiera wskaźniki węzłów docelowych. Na przykład jednym ze sposobów opisania pierwszego powyższego wykresu byłoby (przy założeniu indeksowania zerowego):
[[1, 2], [3], [3], []]
Możesz rozpocząć indeksowanie pierwszego węzła przy dowolnej dowolnej wartości całkowitej (np. Indeksowanie na podstawie 0 lub 1).
Sygnał wejściowy może pochodzić z dowolnego żądanego źródła wejściowego (standard, parametr funkcji itp.). Możesz wybrać dokładny format wejściowy, o ile nie zostaną podane dodatkowe informacje. Na przykład, jeśli chcesz pobierać dane wejściowe ze standardowego interfejsu, każda linia może być listą krawędzi dla powiązanego węzła. Dawny.:
1 2
3
3
'' (blank line)
Indeksy na każdej liście sąsiadów niekoniecznie są posortowane i może istnieć wiele krawędzi łączących dwa węzły (np .:) [[1,1],[]]
. Możesz założyć, że wykres wejściowy jest słabo połączony i nie zawiera cykli (tzn. Jest to DAG).
Wynik
Dane wyjściowe są zgodne z prawdą, jeśli dane wejściowe DAG są redukcją przechodnią, a wartością fałszowania w przeciwnym razie. Może to być dowolny pożądany zlew (stdio, wartość zwracana, parametr wyjściowy itp.)
Przykłady
Wszystkie przykłady używają indeksowania opartego na 0.
[[1,2],[3],[3],[]]
true
[[1,2,3],[3],[3],[]]
false
[[1,1],[]]
false
[[1,2,3,4],[5,6,7],[5,8,9],[6,8,10],[7,9,10],[11,12],[11,13],[12,13],[11,14],[12,14],[13,14],[],[],[],[]]
true
[[5,6,7],[2,3,0,4],[5,8,9],[6,8,10],[7,9,10],[11,12],[11,13],[12,13],[11,14],[12,14],[13,14],[],[],[],[]]
true
[[5,6,7],[2,3,0,4,14,5,7],[5,8,9],[6,8,10],[7,9,10],[11,12],[11,13],[12,13],[11,14],[12,14],[13,14],[],[],[],[]]
false
[[5,6,7],[2,3,0,4],[5,8,9],[6,8,10],[7,9,10,14],[11,12],[11,13],[12,13],[11,14],[12,14],[13,14],[],[],[],[]]
false
[[1,3],[2],[3],[]]
false
Punktacja
To jest kod golfowy; najmniejszy kod w bajtach wygrywa. Twój kod powinien zostać wypełniony w rozsądnym czasie (maksymalnie 10 minut na dowolnym sprzęcie). Obowiązują standardowe luki. Możesz użyć dowolnych wbudowanych funkcji.
źródło
Odpowiedzi:
Ruby,
10197 bajtówProste podejście, które oblicza zasięg z każdego węzła i rozważa, czy do węzła potomnego można dotrzeć za pośrednictwem dowolnego z innych węzłów. Niby zawodzi na cyklicznych grafach, ale definicja DAG sugeruje, że i tak nie powinna być cykliczna.
Wypróbuj online!
źródło
Mathematica,
9582 bajtów13 bajtów zapisanych z powodu @MartinEnder .
Funkcja anonimowa. Pobiera zagnieżdżoną listę jako dane wejściowe (oparte na 1) i zwraca
True
lubFalse
jako dane wyjściowe. Głównym rozwiązaniem jest tutaj 46-bajtowy#~IsomorphicGraphQ~TransitiveReductionGraph@#&
, który sprawdza, czy dany wykres jest izomorficzny w stosunku do redukcji przechodniej. Reszta przekształca dane wejściowe wGraph
obiekt.źródło
CJam (41 bajtów)
Demo online , uprząż testowa
Sekcja
źródło
Galaretka, 20 bajtów
Wykorzystuje indeksowanie 1. Wypróbuj online!
Luźny przegląd
źródło