Dwa różne wierzchołki na ukierunkowanym wykresie są silnie połączone, jeśli na wykresie jest ścieżka od siebie do siebie. Silnie związany komponent wykresu jest podzbiorem wykresie tak, że każda para różnych wierzchołków w podgrupie są mocno połączone, oraz przez dodanie więcej wierzchołków podzbioru pęknie tę właściwość.
Wyzwanie polega na rozdzieleniu wykresu na jego silnie połączone komponenty. W szczególności musisz wyprowadzić wszystkie SCC na wykresie.
I / O:
Jako dane wejściowe możesz użyć listy skierowanych krawędzi, listy sąsiedztwa, macierzy sąsiedztwa lub innego rozsądnego formatu wejściowego. Zapytaj, jeśli nie jesteś pewien. Możesz założyć, że wykres nie ma całkowicie odłączonych wierzchołków i że nie ma żadnych krawędzi własnych, ale nie możesz przyjmować żadnych dalszych założeń. Opcjonalnie możesz również wziąć listę wierzchołków jako dane wejściowe, a także liczbę wierzchołków.
Jako wynik musisz podać partycję wierzchołków, na przykład listę list wierzchołków, gdzie każda podlista jest silnie połączonym składnikiem, lub etykietę wierzchołków, gdzie każda etykieta odpowiada innemu składnikowi.
Jeśli używasz etykietowania, etykiety muszą być wierzchołkami lub kolejną liczbą całkowitą. Ma to na celu uniknięcie rozplątywania obliczeń na etykietach.
Przykłady:
Te przykłady pobierają listy krawędzi, gdzie każda krawędź jest kierowana od pierwszego wpisu do drugiego wpisu, i partycje wyjściowe. Możesz używać tego formatu lub innego.
Dane wejściowe znajdują się w pierwszym wierszu, dane wyjściowe w drugim wierszu.
[[1, 2], [2, 3], [3, 1], [1, 4]]
[[1, 2, 3], [4]]
[[1, 2], [2, 3], [3, 4]]
[[1], [2], [3], [4]]
[[1, 2], [2, 1], [1, 3], [2, 4], [4, 2], [4, 3]]
[[1, 2, 4], [3]]
[[1, 2], [2, 3], [2, 5], [2, 6], [3, 4], [3, 7], [4, 3], [4, 8], [5, 1], [5, 6], [6, 7], [7, 6], [8, 7], [8, 4]]
[[1, 2, 5], [3, 4, 8], [6, 7]]
Punktacja i ograniczenia:
Standardowe luki są jak zawsze zakazane. Również wbudowane, które konkretnie dotyczą silnie połączonych komponentów są zabronione.
Rozwiązania powinny działać w nie więcej niż godzinę na podanych przykładach. (Ma to na celu zapobieganie powolnym wykładniczym rozwiązaniom i nic więcej.)
To jest kod golfowy. Wygrywa najmniej bajtów.
źródło
8
nie ma go w komponencie,[3,4]
ponieważ nie może on tylko każdego z nich (6
i7
żaden z nich nie osiągnie tego).Odpowiedzi:
Python 2 używa numpy,
7162 bajtówPobiera dane wejściowe jako
numpy
macierz reprezentującą przyleganie i liczbę węzłów. Generuje dane wyjściowe jakonumpy
macierz wierszy, która oznacza każdy wierzchołek najniższym numerem wierzchołka w jego składniku.W przypadku macierzy przylegania
M
moc macierzyM**n
zlicza liczbęn
ścieżek -step od każdego wierzchołka początkowego do każdego wierzchołka końcowego. Dodanie tożsamości doM
poprzezM+M**0
modyfikuje macierz przylegania, aby dodać pętlę własną do każdej krawędzi. Tak więc(M+M**0)**n
liczy co najwyżej ścieżki długościn
(z redundancją).Ponieważ każda ścieżka ma co najwyżej długość
n
, liczba węzłów, gdziekolwiek można dotrzeć do(i,j)
wierzchołka, odpowiada dodatniemu wpisowi . Macierz osiągalności jest więc tam, gdzie działa wejście.j
i
(M+M**0)**n
R=(M+M**0)**n>0
>0
Obliczenie wejścia
and
jakoR&R.T
, gdzieR.T
jest transpozycja, daje macierz wskazującą pary wzajemnie osiągalnych wierzchołków. Teni
rząd jest wektorem wskaźnikowym dla wierzchołków w tym samym silnie połączonym składniku. Biorąc jegoargmax
każdego wiersza daje indeks pierwszegoTrue
w nim, który jest indeksem najmniejszego wierzchołka w jego składniku.źródło
JavaScript (ES6), 125 bajtów
Jako argument przyjmuje listę kierowanych par, a wynikiem jest tablica dla każdego wierzchołka, dając pierwszy wierzchołek silnie z nim związany, co moim zdaniem liczy się jako prawidłowe etykietowanie. Na przykład, z wejściem
[[1, 2], [2, 3], [2, 5], [2, 6], [3, 4], [3, 7], [4, 3], [4, 8], [5, 1], [5, 6], [6, 7], [7, 6], [8, 7], [8, 4]]
zwraca[, 1, 1, 3, 3, 1, 6, 6, 3]
(nie ma wierzchołka 0; wierzchołki 1, 2 i 5 mają etykietę 1; 3, 4 i 8 mają etykietę 3, a 6 i 7 mają etykietę 6).źródło
MATL ,
2622 bajtówWykorzystuje to to samo podejście, co odpowiedź @ xnor .
Działa w aktualnej wersji (15.0.0) języka.
Dane wejściowe to macierz przylegania wykresu z wierszami oddzielonymi średnikami. Pierwszy i ostatni przypadek testowy to
Wypróbuj online!
źródło
Pyth, 13 bajtów
Demonstracja , pakiet testowy
Dane wejściowe to lista przylegania, reprezentowana jako słownik, który odwzorowuje wierzchołki na listę wierzchołków, do których ma krawędzie (skierowani sąsiedzi). Dane wyjściowe to partycja.
Istotą programu jest to, że znajdujemy zbiór wierzchołków, które są osiągalne z każdego wierzchołka, a następnie grupujemy wierzchołki według tych zbiorów. Dowolne dwa wierzchołki w tym samym SCC mają ten sam zestaw wierzchołków osiągalny z nich, ponieważ każdy jest osiągalny z drugiego, a osiągalność jest przechodnia. Dowolne wierzchołki w różnych komponentach mają różne zestawy osiągalne, ponieważ żaden z nich nie zawiera drugiego.
Objaśnienie kodu:
źródło