Двудольный граф представляет собой график, вершины которого можно разделить на два множества не пересекаются, таким образом, что ни одно ребро не соединяет две вершины в одном наборе. Граф является двудольным тогда и только тогда, когда он 2-раскрашен.
Вызов
Ваша задача состоит в том, чтобы, учитывая матрицу смежности неориентированного простого графа, определить, является ли он двудольным графом. То есть, если ребро соединяет вершины i и j, оба элемента (i, j) и (j, i) матрицы равны 1.
Поскольку граф является ненаправленным и простым, его матрица смежности симметрична и содержит только 0 и 1.
конкретика
Вы должны использовать матрицу N-N-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
счет
Встроенные функции, которые вычисляют ответ напрямую, запрещены.
Это код-гольф , поэтому выигрывает самая короткая программа (в байтах) к концу этого месяца!
-1
за ложь и любое неотрицательное целое число для правды?0
-> Falsy,>0
-> Truthy, как правило, допускается стандартными правилами true / falsy.-1
и≥ 0
это не так часто, поэтому я и спросил.Ответы:
Шелуха , 17 байт
Печатает положительное целое число, если график является двудольным,
0
если нет. Попробуйте онлайн!объяснение
Это подход грубой силы: переберите все подмножества S вершин и посмотрите, все ли ребра графа находятся между S и его дополнением.
источник
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 в соответствующих индексах поэтому они удалены.Wolfram Language (Mathematica) ,
2625 байтПопробуйте онлайн!
Как это устроено
Учитывая матрицу смежности A, мы находим фиксированную точку, начиная с B = A, а затем заменяя B на A 2 B, изредка обрезая значения, превышающие 1 к 1. k- й шаг этого процесса эквивалентен с точностью
Clip
до нахождения степеней 2k + 1 , в которой (I, J) входа подсчитывает число путей длины 2k + 1 от вершины я J; поэтому фиксированная точка имеет ненулевую (i, j) запись, если мы можем перейти от i к j за нечетное количество шагов.В частности, диагональ неподвижной точки имеет ненулевые элементы, только когда вершина может достичь себя за нечетное количество шагов: если существует нечетный цикл. Таким образом, след неподвижной точки равен 0 тогда и только тогда, когда график является двудольным.
Другое 25-байтовое решение этой формы заключается
Tr[#O@n//.x_:>#.#.x]===0&
в том, чтобы дать кому-нибудь представление о том, как увеличить количество байтов еще ниже.Предыдущие усилия
Я попробовал несколько подходов к этому ответу, прежде чем остановиться на этом.
26 байтов: матричные экспоненты
Также полагается на нечетные степени матрицы смежности. Поскольку x * exp (x 2 ) есть x + x 3 + x 5/2 ! + х 7/4 ! + ..., когда x является матрицей A, она имеет положительный член для каждой нечетной степени A, поэтому она также будет иметь нулевой след, если A имеет нечетный цикл. Это решение очень медленно для больших матриц.
29 байт: большая нечетная мощность
Для матрицы n по n A находит 2n + 1 и затем проверяет диагональ. Здесь
#~Table~Tr[2#!]
генерируется 2n копий входной матрицы n by n и#.##& @@ {a,b,c,d}
распаковываетсяa.a.b.c.d
, умножая в результате 2n + 1 копии матрицы.53 байта: матрица Лапласа
Использует неясный результат в теории спектральных графов ( предложение 1.3.10 в этом pdf ).
источник
Tr[#.Nest[#.#&,#,Tr[#!]]]<1&
. (Это невероятный ответ, который становится все лучше с каждым разом, когда я на него смотрю!)BipartiteGraphQ@AdjacencyGraph@#&
MatrixExp
возвращает результаты в терминах неоцененныхRoot
объектов, которые автоматически не упрощаются при добавлении. ЭтиN@
силыRoot
должны быть рассчитаны численно, чтобы затем можно было оценить их достоверность.BipartiteGraphQ@*AdjacencyGraph
, но это еще дольше.JavaScript, 78 байт
Входной массив массива 0/1, вывод true / false.
Показать фрагмент кода
источник
Pyth , 25 байт
Попробуйте онлайн!
Это возвращает
-1
ложь и любое неотрицательное целое число для правдивости.Как это устроено
Это работает в коммите d315e19 , текущая версия PyO от TiO.
источник