Це двостороннє?


13

Двочастковий граф являє собою графік, вершини якого можна розділити на два безлічі НЕ перетинаються, таким чином, що ні одне ребро не з'єднує дві вершини в одному наборі. Графік є двостороннім і тоді, і лише тоді, коли він є двоколірним.


Виклик

Ваше завдання полягає в тому, щоб, враховуючи матрицю суміжності непрямого простого графа, визначити, чи є це двобічний графік. Тобто, якщо ребро з'єднує вершини i і j, то і (i, j) і (j, i) запис матриці дорівнює 1.

Оскільки графік непрямий і простий, то його матриця суміжності симетрична і містить лише 0 і 1.

Особливості

Ви повинні взяти матрицю N-by-N (будь-яку форму, наприклад, список списків, список рядків, C-подібний int**і розмір, сплющений масив, необроблений вхід тощо).

Функція / програма повинна повертати / виводити триєдне значення, якщо графік двосторонній, а помилковий помилковий.

Випробування

['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

Оцінка балів

Вбудовані, які безпосередньо обчислюють відповідь, заборонені.

Це , тому найкоротша програма (в байтах) до кінця цього місяця виграє!


Пов'язані , а насправді прикордонні дупи, тому що бути двостороннім еквівалентно відсутності непарних циклів, і більшість відповідей на це питання працюють шляхом перерахування всіх циклів та вивчення їх тривалості.
Пітер Тейлор

@PeterTaylor Так, але є більш прості способи вирішити цю проблему.
Colera Su

@ColeraSu Замість truthy / falsy, чи можемо ми повернутися -1за фальшивим чи будь-яким невід'ємним цілим числом для truthy?
Містер Xcoder

@MishaLavrov 0-> Falsy, >0-> Truthy, як правило, дозволено стандартними правилами truthy / falesy. -1і ≥ 0це не так часто, тому я запитав.
Містер Xcoder

@ Mr.Xcoder Це добре.
Колера Су

Відповіді:


4

Лушпиння , 17 байт

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

Друкує додатне ціле число, якщо графік двосторонній, 0якщо ні. Спробуйте в Інтернеті!

Пояснення

Це підхід грубої сили: повторіть усі підмножини S вершин і подивіться, чи всі ребра в графіку знаходяться між S та його доповненням.

§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.

@ Mr.Xcoder Ну, припустимо, M = [[1,2,3],[4,5,6],[7,8,9]]і S = [1,0,1]( Mце завжди двійкова матриця в програмі, але це простіше пояснити таким чином). Фільтрація кожного ряду Mпо Sдає [[1,3],[4,6],[7,9]]: для кожного рядка, я видаляю на цих індексах елементів , де Sє 0. Тоді я заперечую Sпоелементно , щоб отримати [0,1,0], і фільтр Mтим , щоб отримати [[4,6]]: перші і останні рядки має 0 у відповідних індексах , тому їх видаляють.
Згарб

17

Мова Вольфрама (Mathematica) , 26 25 байт

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

Спробуйте в Інтернеті!

Як це працює

Враховуючи матрицю суміжності A, ми знаходимо фіксовану точку, починаючи з B = A, а потім замінюючи B на A 2 B, періодично відсікаючи значення, що перевищують 1 до 1. k- й етап цього процесу еквівалентний до значень Clipпотужності A 2k + 1 , в якому запис (i, j) рахує кількість шляхів довжиною 2k + 1 від вершини i до j; тому фіксована точка закінчується тим, що має ненульовий (i, j) запис iff, якщо ми можемо переходити від i до j з непарною кількістю кроків.

Зокрема, діагональ фіксованої точки має ненульові записи, лише коли вершина може дійти до себе непарною кількістю кроків: якщо є непарний цикл. Тож слід фіксованої точки дорівнює 0, якщо і лише тоді, коли графік двосторонній.

Інше 25-байтне рішення цієї форми полягає Tr[#O@n//.x_:>#.#.x]===0&в тому випадку, якщо це дає комусь уявлення про те, як підсунути кількість байтів ще нижче.

Попередні зусилля

Я спробував декілька підходів до цієї відповіді, перш ніж зупинитися на цьому.

26 байт: матричні експоненціали

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

Також покладається на непарні сили матриці суміжності. Оскільки x * exp (x 2 ) є x + x 3 + x 5/2 ! + х 7/4 ! + ..., коли x - матриця A, це має позитивний додаток для кожної непарної сили A, тому вона також матиме нульовий слід, якщо A має непарний цикл. Для великих матриць це рішення дуже повільне.

29 байт: велика непарна потужність

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

Для матриці n від n знаходить A 2n + 1, а потім перевіряє діагональ. Тут #~Table~Tr[2#!]генерується 2n копій n на n вхідної матриці і #.##& @@ {a,b,c,d}розпаковується до a.a.b.c.d, множачи разом 2n + 1 копії матриці.

53 байти: матриця Лаплація

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

Використовує незрозумілий результат у теорії спектральних графів ( пропозиція 1.3.10 у цьому pdf ).


Я думаю, що ви можете поголити пару байтів за допомогою свого більш ефективного методу Tr[#.Nest[#.#&,#,Tr[#!]]]<1&. (Це неймовірна відповідь, яка стає все кращою щоразу, коли я дивлюся на це!)
Не дерево

1
Це менше байтів, що напіввбудованому (потрібно дві функції)BipartiteGraphQ@AdjacencyGraph@#&
Келлі Лоудер

2
@KellyLowder: для великих матриць MatrixExpповертає результати у вигляді неоцінених Rootоб'єктів, які автоматично не спрощуються при додаванні. Ці N@сили ці Rootю необхідно обчислити чисельно , так що truthiness потім можуть бути оцінені.
Майкл Зайферт

1
@Notatree Ваш підхід дійсно обрізає кілька байтів, але вони коштують; для матриць 18x18 - це в 1000 разів повільніше, і звідти стає гірше. Я думаю, що якщо я вніс цю зміну, я втрачаю право називати ефективний метод "ефективним".
Міша Лавров

1
@KellyLowder Можна скоротити це до BipartiteGraphQ@*AdjacencyGraph, але це ще довше.
Мартін Ендер

3

JavaScript, 78 байт

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

Вхідний масив масиву 0/1, вихід true / false.


2

Pyth , 25 байт

xmyss.D.DRx0dQx1d.nM*FQss

Спробуйте в Інтернеті!

Це повертається -1для хибного, і будь-яке невід'ємне ціле число для truthy.

Як це працює

xmyss.D.DRx0dQx1d.nM * FQss ~ Повна програма, отримує матрицю суміжності від STDIN.

                    * FQ ~ Зменшити (скласти) декартовим продуктом.
                 .nM ~ Згладьте кожного.
 m ~ Карта зі змінною d.
         RQ ~ Для кожного елемента на вході,
       .D ~ Видалити елементи в індексах ...
          x0d ~ Усі показники 0 у d.
     .D ~ І зі цього списку видаліть елементи в індексах ...
              x1d ~ Усі показники 1 в d.
    s ~ Згладити.
   s ~ Сума. Я міг би використати s, якщо [] не з’явиться.
  y ~ Подвійний.
x ~ У наведеному вище відображенні отримайте перший індекс ...
                       ss ~ Загальна кількість 1 у вхідній матриці.

Це працює у віддаленні d315e19 , поточній версії TiO в Pyth.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.