Un gráfico bipartito es un gráfico cuyos vértices se pueden dividir en dos conjuntos disjuntos, de modo que ningún borde conecte dos vértices en el mismo conjunto. Un gráfico es bipartito si y solo si tiene 2 colores.
Desafío
Su tarea es, dada la matriz de adyacencia de un gráfico simple no dirigido, determinar si es un gráfico bipartito. Es decir, si un borde conecta los vértices i y j, tanto (i, j) como (j, i) la entrada de la matriz son 1.
Como el gráfico no está dirigido y es simple, su matriz de adyacencia es simétrica y contiene solo 0 y 1.
Detalles específicos
Debe tomar una matriz N-por-N como entrada (en cualquier forma, por ejemplo, lista de listas, lista de cadenas, tipo C int**
y tamaño, matriz aplanada, entrada sin formato, etc.).
La función / programa debería devolver / generar un valor verdadero si el gráfico es bipartito, y falso de lo contrario.
Casos de prueba
['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
Puntuación
Las construcciones que calculan la respuesta directamente están prohibidas.
Este es el código de golf , por lo que gana el programa más corto (en bytes) para finales de este mes.
fuente
-1
por falso y cualquier número entero no negativo por verdadero?0
-> Falsy,>0
-> Truthy generalmente está permitido por las reglas estándar de verdad / falsedad.-1
y≥ 0
no es tan común, por eso lo pregunté.Respuestas:
Casco , 17 bytes
Imprime un entero positivo si el gráfico es bipartito,
0
si no. Pruébalo en línea!Explicación
Este es un enfoque de fuerza bruta: recorra todos los subconjuntos S de vértices y vea si todos los bordes en el gráfico están entre S y su complemento.
fuente
M = [[1,2,3],[4,5,6],[7,8,9]]
yS = [1,0,1]
(M
siempre es una matriz binaria en el programa, pero es más fácil de explicar de esta manera). Al filtrar cada fila deM
by seS
obtiene[[1,3],[4,6],[7,9]]
: para cada fila, elimino los elementos en esos índices dondeS
tiene un 0. Luego niego elS
elemento en cuanto a obtener[0,1,0]
, y filtroM
por eso para obtener[[4,6]]
: la primera y la última fila tienen 0 en los índices correspondientes , por lo que se eliminan.Wolfram Language (Mathematica) ,
2625 bytesPruébalo en línea!
Cómo funciona
Dada una matriz de adyacencia A, encontramos el punto fijo de comenzar con B = A y luego reemplazar B por A 2 B, ocasionalmente recortando valores mayores de 1 a 1. El késimo paso de este proceso es equivalente hasta
Clip
encontrar poderes A 2k + 1 , en el que la entrada (i, j) cuenta el número de rutas de longitud 2k + 1 desde el vértice i hasta j; por lo tanto, el punto fijo termina teniendo una entrada distinta de cero (i, j) si podemos ir de i a j en un número impar de pasos.En particular, la diagonal del punto fijo tiene entradas distintas de cero solo cuando un vértice puede alcanzarse en un número impar de pasos: si hay un ciclo impar. Por lo tanto, la traza del punto fijo es 0 si y solo si el gráfico es bipartito.
Otra solución de 25 bytes de este formulario es
Tr[#O@n//.x_:>#.#.x]===0&
, en caso de que esto le dé a alguien ideas sobre cómo llevar el recuento de bytes aún más bajo.Esfuerzos previos
He intentado varios enfoques para esta respuesta antes de decidirme por esta.
26 bytes: exponenciales de matriz
También se basa en poderes extraños de la matriz de adyacencia. ¡Dado que x * exp (x 2 ) es x + x 3 + x 5/2 ! + x 7/4 ! + ..., cuando x es una matriz A, tiene un término positivo para cada potencia impar de A, por lo que también tendrá un rastro cero si A tiene un ciclo impar. Esta solución es muy lenta para matrices grandes.
29 bytes: gran potencia impar
Para una matriz n por n A, encuentra A 2n + 1 y luego realiza la verificación diagonal. Aquí,
#~Table~Tr[2#!]
genera 2n copias de la matriz de entrada n por n, y se#.##& @@ {a,b,c,d}
descomprime ena.a.b.c.d
, multiplicando juntas 2n + 1 copias de la matriz como resultado.53 bytes: matriz laplaciana
Utiliza un resultado oscuro en la teoría de grafos espectrales ( Proposición 1.3.10 en este pdf ).
fuente
Tr[#.Nest[#.#&,#,Tr[#!]]]<1&
. (¡Esta es una respuesta increíble que mejora cada vez que la miro!)BipartiteGraphQ@AdjacencyGraph@#&
MatrixExp
devuelve resultados en términos deRoot
objetos no evaluados , que no se simplifican automáticamente cuando se agregan. LasN@
fuerzas obligan a estosRoot
a calcularse numéricamente para que luego se pueda evaluar la veracidad.BipartiteGraphQ@*AdjacencyGraph
, pero aún es más largo.JavaScript, 78 bytes
Matriz de entrada de matriz de 0/1, salida verdadero / falso.
Mostrar fragmento de código
fuente
Pyth , 25 bytes
Pruébalo en línea!
Esto devuelve
-1
falso, y cualquier número entero no negativo para verdad.Cómo funciona
Esto funciona en commit d315e19 , la versión actual de Pyth que tiene TiO.
fuente
APL (Dyalog Extended) ,
1613 bytesPruébalo en línea!
-3 bytes gracias a @ H.PWiz.
Utiliza el algoritmo de la respuesta superior de Mathematica de Misha Lavrov : inicialice
A = B = M
, multipliqueB
a la izquierda dos vecesA
y sujételo hasta que llegue al punto fijo, y pruebe si las entradas diagonales son todas cero.El producto de matriz regular
A+.×B
cuenta el número de rutas de dos pasos de nodom
a nodo quep
pasan a través de cualquier nodo intermedion
. Si cambiamos el código aA∨.∧B
, en su lugar obtenemos una matriz booleana que indica si existe una ruta de dos pasos de nodom
a nodop
. No necesitamos una operación adicional de "sujeción" de esa manera.Cómo funciona
fuente