Um gráfico bipartido é um gráfico cujos vértices podem ser divididos em dois conjuntos disjuntos, de modo que nenhuma aresta conecta dois vértices no mesmo conjunto. Um gráfico é bipartido se e somente se for de duas cores.
Desafio
Sua tarefa é, dada a matriz de adjacência de um gráfico simples não direcionado, determinar se é um gráfico bipartido. Ou seja, se uma aresta conecta os vértices iej, as entradas (i, j) e (j, i) da matriz são 1.
Como o gráfico não é direcionado e é simples, sua matriz de adjacência é simétrica e contém apenas 0 e 1.
Específicos
Você deve usar uma matriz N por N como entrada (de qualquer forma, por exemplo, lista de listas, lista de cadeias, int**
tamanho e tipo C , matriz achatada, entrada bruta, etc.).
A função / programa deve retornar / gerar um valor verdadeiro se o gráfico for bipartido e, caso contrário, falsificar.
Casos de teste
['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
Pontuação
Os componentes internos que calculam a resposta diretamente são banidos.
Isso é código-golfe , então o programa mais curto (em bytes) até o final deste mês vence!
fonte
-1
por falsidade e qualquer número inteiro não negativo para verdade?0
-> Falsy,>0
-> Truthy é geralmente permitido pelas regras padrão de truthy / falsy.-1
e≥ 0
não é tão comum, é por isso que perguntei.Respostas:
Casca , 17 bytes
Imprime um número inteiro positivo se o gráfico for bipartido,
0
se não. Experimente online!Explicação
Essa é uma abordagem de força bruta: itere em todos os subconjuntos S dos vértices e verifique se todas as arestas no gráfico estão entre S e seu complemento.
fonte
M = [[1,2,3],[4,5,6],[7,8,9]]
eS = [1,0,1]
(M
é sempre uma matriz binária no programa, mas é mais fácil explicar dessa maneira). Filtrar cada linha deM
porS
dá[[1,3],[4,6],[7,9]]
: para cada linha, removo os elementos nos índices em queS
há um 0. Em seguida, nego oS
elemento para obter[0,1,0]
e filtreM
por esse para obter[[4,6]]
: a primeira e a última linha têm 0 nos índices correspondentes , para que eles sejam removidos.Wolfram Language (Mathematica) ,
2625 bytesExperimente online!
Como funciona
Dada uma matriz de adjacência A, encontramos o ponto fixo de começar com B = A e substituir B por A 2 B, ocasionalmente cortando valores maiores que 1 a 1. A k- ésima etapa desse processo é equivalente à capacidade
Clip
de encontrar Um 2k + 1 , no qual a entrada (i, j) conta o número de caminhos de comprimento 2k + 1 do vértice i até j; portanto, o ponto fixo acaba tendo uma entrada diferente de zero (i, j) se pudermos ir de i a j em um número ímpar de etapas.Em particular, a diagonal do ponto fixo possui entradas diferentes de zero somente quando um vértice pode alcançar a si mesmo em um número ímpar de etapas: se houver um ciclo ímpar. Portanto, o traço do ponto fixo é 0 se e somente se o gráfico for bipartido.
Outra solução de 25 bytes deste formulário é
Tr[#O@n//.x_:>#.#.x]===0&
, caso isso dê a alguém idéias sobre como aumentar ainda mais a contagem de bytes.Esforços anteriores
Eu tentei várias abordagens para essa resposta antes de decidir sobre essa.
26 bytes: exponenciais da matriz
Também conta com poderes ímpares da matriz de adjacência. Desde x * exp (x 2 ) é x + x 3 + x 5 /2! + x 7/4 ! + ..., quando x é uma matriz A, esse termo é positivo para todas as potências ímpares de A; portanto, também terá zero traço se A tiver um ciclo ímpar. Essa solução é muito lenta para matrizes grandes.
29 bytes: grande potência ímpar
Para uma matriz n por n A, localiza A 2n + 1 e depois faz a verificação diagonal. Aqui,
#~Table~Tr[2#!]
gera 2n cópias da matriz de entrada n por n e#.##& @@ {a,b,c,d}
descompacta paraa.a.b.c.d
, multiplicando 2n + 1 cópias da matriz como resultado.53 bytes: matriz da Lapônia
Usa um resultado obscuro na teoria dos grafos espectrais ( Proposição 1.3.10 neste pdf ).
fonte
Tr[#.Nest[#.#&,#,Tr[#!]]]<1&
. (Esta é uma resposta incrível que está cada vez melhor a cada vez que olho para ela!)BipartiteGraphQ@AdjacencyGraph@#&
MatrixExp
retorna resultados em termos deRoot
objetos não avaliados , que não são automaticamente simplificados quando adicionados. AsN@
forçasRoot
são calculadas numericamente para que a veracidade possa ser avaliada.BipartiteGraphQ@*AdjacencyGraph
, mas ainda é mais longo.JavaScript, 78 bytes
Matriz de entrada da matriz de 0/1, saída verdadeira / falsa.
Mostrar snippet de código
fonte
Pitão , 25 bytes
Experimente online!
Isso retorna
-1
para falso e qualquer número inteiro não negativo para verdade.Como funciona
Isso funciona no commit d315e19 , a versão atual do Pyth TiO.
fonte