Dwudzielny wykres przedstawia wykres, którego wierzchołki mogą być podzielone na dwa zestawy rozłącznego, tak że nie ma krawędź łączy dwa wierzchołki w jednym zestawie. Wykres jest dwustronny wtedy i tylko wtedy, gdy jest dwukolorowy.
Wyzwanie
Twoim zadaniem jest, biorąc pod uwagę macierz przylegania niekierowanego prostego wykresu, ustalenie, czy jest to wykres dwustronny. To znaczy, jeśli krawędź łączy wierzchołki i i j, zarówno (i, j), jak i (j, i) wejście macierzy to 1.
Ponieważ wykres jest bezkierunkowy i prosty, jego macierz przylegania jest symetryczna i zawiera tylko 0 i 1.
Specyfika
Powinieneś wziąć macierz N-na-N jako dane wejściowe (w dowolnej formie, np. Lista list, lista ciągów, typ C int**
i rozmiar, spłaszczona tablica, surowe dane wejściowe itp.).
Funkcja / program powinien zwrócić / wyprowadzić prawdziwą wartość, jeśli wykres jest dwustronny, a fałsz w przeciwnym razie.
Przypadki testowe
['00101',
'00010',
'10001',
'01000',
'10100'] : False
['010100',
'100011',
'000100',
'101000',
'010000',
'010000'] : True (divide into {0, 2, 4, 5} and {1, 3})
['00',
'00'] : True
Punktacja
Wbudowane, które obliczają odpowiedź bezpośrednio, są zbanowane.
To jest golf golfowy , więc wygrywa najkrótszy program (w bajtach) do końca tego miesiąca!
źródło
-1
do fałszywości i jakiejkolwiek nieujemnej liczby całkowitej dla prawdy?0
-> Falsy,>0
-> Prawda jest na ogół dozwolona przez standardowe reguły dotyczące prawdy / fałszu.-1
i≥ 0
nie jest tak powszechne, dlatego zapytałem.Odpowiedzi:
Łuska , 17 bajtów
Wyświetla dodatnią liczbę całkowitą, jeśli wykres jest dwustronny,
0
jeśli nie. Wypróbuj online!Wyjaśnienie
Jest to podejście z użyciem siły brutalnej: iteruj przez wszystkie podzbiory S wierzchołków i sprawdź, czy wszystkie krawędzie na wykresie znajdują się między S a jego dopełnieniem.
źródło
M = [[1,2,3],[4,5,6],[7,8,9]]
iS = [1,0,1]
(M
zawsze jest to binarna matryca w programie, ale łatwiej to wytłumaczyć). Filtrowanie każdego wierszaM
wedługS
daje[[1,3],[4,6],[7,9]]
: dla każdego wiersza usuwam elementy przy indeksach, w którychS
ma 0. Następnie negujęS
element, aby uzyskać[0,1,0]
, i filtrujęM
według tego, aby uzyskać[[4,6]]
: pierwszy i ostatni wiersz mają 0 w odpowiednich indeksach , więc są usuwane.Wolfram Language (Mathematica) ,
2625 bajtówWypróbuj online!
Jak to działa
Biorąc pod uwagę macierz przylegania A, znajdujemy stały punkt rozpoczynający się od B = A, a następnie zastępujący B przez A 2 B, czasami obcinający wartości większe niż 1 do 1. K- ty etap tego procesu jest równoważny
Clip
do znalezienia mocy 2k + 1 , w którym (i, j) wejścia zlicza liczbę ścieżek długości 2k + 1 z wierzchołka i do j; dlatego punkt stały ma niezerową (i, j) pozycję, jeśli możemy przejść od i do j w nieparzystej liczbie kroków.W szczególności przekątna punktu stałego ma niezerowe wpisy tylko wtedy, gdy wierzchołek może dotrzeć do siebie w nieparzystej liczbie kroków: jeśli występuje nieparzysty cykl. Tak więc ślad punktu stałego wynosi 0 wtedy i tylko wtedy, gdy wykres jest dwustronny.
Innym 25-bajtowym rozwiązaniem tego formularza jest
Tr[#O@n//.x_:>#.#.x]===0&
, na wypadek, gdyby ktokolwiek dał pomysł, jak jeszcze bardziej obniżyć liczbę bajtów.Poprzednie wysiłki
Próbowałem wielu podejść do tej odpowiedzi, zanim zdecydowałem się na tę.
26 bajtów: wykładnicze macierze
Opiera się również na nieparzystych mocach macierzy przylegania. Ponieważ x * exp (x 2 ), to x + x 3 + X 5 /2! + x 7/4 ! + ..., gdy x jest macierzą A, ma to dodatni wyraz na każdą nieparzystą moc A, więc będzie miał również zerowy ślad, jeśli A ma nieparzysty cykl. To rozwiązanie jest bardzo wolne w przypadku dużych matryc.
29 bajtów: duża nieparzysta moc
Dla macierzy n na n A znajduje A 2n + 1, a następnie sprawdza przekątną. Tutaj
#~Table~Tr[2#!]
generuje 2n kopii macierzy wejściowej n na n i#.##& @@ {a,b,c,d}
rozpakowuje doa.a.b.c.d
, mnożąc razem 2n + 1 kopii macierzy.53 bajty: macierz Laplaciana
Wykorzystuje niejasny wynik w teorii grafów spektralnych ( Twierdzenie 1.3.10 w tym pliku pdf ).
źródło
Tr[#.Nest[#.#&,#,Tr[#!]]]<1&
. (To niesamowita odpowiedź, która staje się coraz lepsza za każdym razem, gdy na nią patrzę!)BipartiteGraphQ@AdjacencyGraph@#&
MatrixExp
zwraca wyniki w kategoriach nieocenionychRoot
obiektów, które nie są automatycznie upraszczane po dodaniu. TeN@
siły sąRoot
S, a następnie oblicza się numerycznie, tak że truthiness mogą być oceniane.BipartiteGraphQ@*AdjacencyGraph
, ale wciąż trwa dłużej.JavaScript, 78 bajtów
Tablica wejściowa tablicy 0/1, wyjście prawda / fałsz.
Pokaż fragment kodu
źródło
Pyth , 25 bajtów
Wypróbuj online!
To zwraca
-1
falsy i każdą nieujemną liczbę całkowitą dla prawdy.Jak to działa
Działa to w zatwierdzeniu d315e19 , obecna wersja PytO TiO.
źródło