Czy to jest dwustronna?

13

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 , więc wygrywa najkrótszy program (w bajtach) do końca tego miesiąca!

Colera Su
źródło
Powiązane , aw rzeczywistości graniczne dupe, ponieważ bycie dwustronnym jest równoznaczne z brakiem nieparzystych cykli, a większość odpowiedzi na to pytanie działa poprzez wyliczenie wszystkich cykli i zbadanie ich długości.
Peter Taylor,
@PeterTaylor Tak, ale istnieją prostsze sposoby rozwiązania tego problemu.
Colera Su
@ColeraSu Zamiast prawda / fałsz, czy możemy powrócić -1do fałszywości i jakiejkolwiek nieujemnej liczby całkowitej dla prawdy?
Pan Xcoder,
@MishaLavrov 0-> Falsy, >0-> Prawda jest na ogół dozwolona przez standardowe reguły dotyczące prawdy / fałszu. -1i ≥ 0nie jest tak powszechne, dlatego zapytałem.
Pan Xcoder,
@ Mr.Xcoder W porządku.
Colera Su,

Odpowiedzi:

4

Łuska , 17 bajtów

§V¤=ṁΣṠMSȯDfm¬ṀfΠ

Wyświetla dodatnią liczbę całkowitą, jeśli wykres jest dwustronny, 0jeś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.

§V¤=ṁΣṠMSȯDfm¬ṀfΠ  Implicit input: binary matrix M.
                Π  Cartesian product; result is X.
                   Elements of X are binary lists representing subsets of vertices.
                   If M contains an all-0 row, the corresponding vertex is never chosen,
                   but it is irrelevant anyway, since it has no neighbors.
                   All-1 rows do not occur, as the graph is simple.
      ṠM           For each list S in X:
              Ṁf   Filter each row of M by S, keeping the bits at the truthy indices of S,
        S  fm¬     then filter the result by the element-wise negation of S,
         ȯD        and concatenate the resulting matrix to itself.
                   Now we have, for each subset S, a matrix containing the edges
                   from S to its complement, twice.
§V                 1-based index of the first matrix
  ¤=               that equals M
    ṁΣ             by the sum of all rows, i.e. total number of 1s.
                   Implicitly print.
Zgarb
źródło
@ Mr.Xcoder Cóż, załóżmy M = [[1,2,3],[4,5,6],[7,8,9]]i S = [1,0,1]( Mzawsze jest to binarna matryca w programie, ale łatwiej to wytłumaczyć). Filtrowanie każdego wiersza Mwedług Sdaje [[1,3],[4,6],[7,9]]: dla każdego wiersza usuwam elementy przy indeksach, w których Sma 0. Następnie neguję Selement, aby uzyskać [0,1,0], i filtruję Mwedług tego, aby uzyskać [[4,6]]: pierwszy i ostatni wiersz mają 0 w odpowiednich indeksach , więc są usuwane.
Zgarb,
17

Wolfram Language (Mathematica) , 26 25 bajtów

Tr[#//.x_:>#.#.Clip@x]<1&

Wypró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 Clipdo 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

N@Tr[#.MatrixExp[#.#]]==0&

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

Tr[#.##&@@#~Table~Tr[2#!]]<1&

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 do a.a.b.c.d, mnożąc razem 2n + 1 kopii macierzy.

53 bajty: macierz Laplaciana

(e=Eigenvalues)[(d=DiagonalMatrix[Tr/@#])+#]==e[d-#]&

Wykorzystuje niejasny wynik w teorii grafów spektralnych ( Twierdzenie 1.3.10 w tym pliku pdf ).

Misza Ławrow
źródło
Myślę, że możesz ogolić kilka bajtów z bardziej wydajnej metody Tr[#.Nest[#.#&,#,Tr[#!]]]<1&. (To niesamowita odpowiedź, która staje się coraz lepsza za każdym razem, gdy na nią patrzę!)
Nie drzewo,
1
Ma mniej bajtów niż częściowo wbudowana (potrzebuje dwóch funkcji)BipartiteGraphQ@AdjacencyGraph@#&
Kelly Lowder,
2
@ KellyLowder: dla dużych macierzy MatrixExpzwraca wyniki w kategoriach nieocenionych Rootobiektów, które nie są automatycznie upraszczane po dodaniu. Te N@siły są RootS, a następnie oblicza się numerycznie, tak że truthiness mogą być oceniane.
Michael Seifert
1
@Notatree Twoje podejście rzeczywiście goli kilka bajtów, ale kosztuje; dla matryc 18x18 jest 1000 razy wolniejszy i od tego czasu staje się coraz gorzej. Myślę, że jeśli dokonam tej zmiany, tracę prawo do nazywania efektywnej metody „wydajną”.
Misza Ławrow
1
@KellyLowder Możesz to skrócić BipartiteGraphQ@*AdjacencyGraph, ale wciąż trwa dłużej.
Martin Ender,
3

JavaScript, 78 bajtów

m=>!m.some((l,i)=>m.some((_,s)=>(l=m.map(t=>t.some((c,o)=>c&&l[o])))[i]&&s%2))

Tablica wejściowa tablicy 0/1, wyjście prawda / fałsz.

tsh
źródło
2

Pyth , 25 bajtów

xmyss.D.DRx0dQx1d.nM*FQss

Wypróbuj online!

To zwraca -1falsy i każdą nieujemną liczbę całkowitą dla prawdy.

Jak to działa

xmyss.D.DRx0dQx1d.nM * FQss ~ Pełny program, otrzymuje macierz przylegania od STDIN.

                    * FQ ~ Zmniejsz (złóż) według produktu kartezjańskiego.
                 .nM ~ Spłaszcz każdy.
 m ~ Mapa ze zmienną d.
         RQ ~ Dla każdego elementu na wejściu
       .D ~ Usuń elementy z indeksów ...
          x0d ~ Wszystkie indeksy 0 w d.
     .D ~ I z tej listy usuń elementy w indeksach ...
              x1d ~ Wszystkie indeksy 1 in d.
    s ~ Spłaszcz.
   s ~ Sum. Mógłbym użyć s, gdyby [] się nie pojawił.
  y ~ Double.
x ~ W powyższym odwzorowaniu uzyskaj pierwszy indeks ...
                       ss ~ Całkowita liczba 1 w matrycy wejściowej.

Działa to w zatwierdzeniu d315e19 , obecna wersja PytO TiO.

Pan Xcoder
źródło