Un graphe bipartite est un graphe dont les sommets peuvent être divisés en deux ensembles disjoints, de sorte qu'aucune arête ne relie deux sommets du même ensemble. Un graphique est bipartite si et seulement s'il est bicolore.
Défi
Votre tâche consiste à, étant donné la matrice d'adjacence d'un graphe simple non orienté, déterminer s'il s'agit d'un graphe biparti. Autrement dit, si une arête relie les sommets i et j, les entrées (i, j) et (j, i) de la matrice sont égales à 1.
Le graphe étant non orienté et simple, sa matrice d'adjacence est symétrique et ne contient que 0 et 1.
Détails
Vous devez prendre une matrice N par N en entrée (sous n'importe quelle forme, par exemple liste de listes, liste de chaînes, de type C int**
et taille, tableau aplati, entrée brute, etc.).
La fonction / le programme doit retourner / afficher une valeur véridique si le graphique est bipartite, et faux sinon.
Cas de test
['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
Notation
Les buildins qui calculent directement la réponse sont interdits.
Il s'agit de code-golf , donc le programme le plus court (en octets) d'ici la fin de ce mois gagne!
-1
pour fausse et tout entier non négatif pour vérité?0
-> Falsy,>0
-> Truthy est généralement autorisé par les règles standard de vérité / fausse.-1
et ce≥ 0
n'est pas si courant, c'est pourquoi j'ai demandé.Réponses:
Husk , 17 octets
Imprime un entier positif si le graphique est biparti,
0
sinon. Essayez-le en ligne!Explication
Il s'agit d'une approche par force brute: parcourez tous les sous-ensembles S des sommets et voyez si toutes les arêtes du graphe sont entre S et son complément.
la source
M = [[1,2,3],[4,5,6],[7,8,9]]
etS = [1,0,1]
(M
est toujours une matrice binaire dans le programme, mais c'est plus facile à expliquer de cette façon). Filtrer chaque ligne deM
parS
donne[[1,3],[4,6],[7,9]]
: pour chaque ligne, je supprime les éléments à ces indices oùS
a un 0. Ensuite, je nie parS
élément pour obtenir[0,1,0]
, et je filtreM
par cela pour obtenir[[4,6]]
: la première et la dernière ligne ont 0 dans les indices correspondants , ils sont donc supprimés.Wolfram Language (Mathematica) ,
2625 octetsEssayez-le en ligne!
Comment ça fonctionne
Étant donné une matrice d'adjacence A, nous trouvons le point fixe de commencer par B = A, puis de remplacer B par A 2 B, écrêtant parfois des valeurs supérieures à 1 à 1. La k ème étape de ce processus est équivalente
Clip
aux puissances de recherche A 2k + 1 , dans lequel l'entrée (i, j) compte le nombre de chemins de longueur 2k + 1 du sommet i à j; par conséquent, le point fixe finit par avoir une entrée non nulle (i, j) si nous pouvons passer de i à j en un nombre impair d'étapes.En particulier, la diagonale du point fixe n'a des entrées non nulles que lorsqu'un sommet peut atteindre lui-même un nombre impair d'étapes: s'il y a un cycle impair. La trace du point fixe est donc 0 si et seulement si le graphe est bipartite.
Une autre solution de 25 octets de ce formulaire est
Tr[#O@n//.x_:>#.#.x]===0&
, au cas où cela donnerait à quelqu'un des idées sur la façon de pousser le nombre d'octets encore plus bas.Efforts antérieurs
J'ai essayé un certain nombre d'approches de cette réponse avant de m'installer sur celle-ci.
26 octets: exponentielles matricielles
S'appuie également sur les puissances impaires de la matrice d'adjacence. Puisque x * exp (x 2 ) est x + x 3 + x 5/2 ! + x 7/4 ! + ..., lorsque x est une matrice A, cela a un terme positif pour chaque puissance impaire de A, donc il aura également une trace nulle si A a un cycle impair. Cette solution est très lente pour les grandes matrices.
29 octets: grande puissance impaire
Pour une matrice n par n A, trouve A 2n + 1 puis effectue la vérification diagonale. Ici,
#~Table~Tr[2#!]
génère 2n copies de la matrice d'entrée n par n et#.##& @@ {a,b,c,d}
déballea.a.b.c.d
, multipliant ainsi 2n + 1 copies de la matrice.53 octets: matrice laplacienne
Utilise un résultat obscur dans la théorie des graphes spectraux ( proposition 1.3.10 dans ce pdf ).
la source
Tr[#.Nest[#.#&,#,Tr[#!]]]<1&
. (C'est une réponse incroyable qui ne cesse de s'améliorer à chaque fois que je la regarde!)BipartiteGraphQ@AdjacencyGraph@#&
MatrixExp
renvoie des résultats en termes d'Root
objets non évalués , qui ne sont pas automatiquement simplifiés lorsqu'ils sont ajoutés. LesN@
forcesRoot
doivent être calculées numériquement pour que la véracité puisse ensuite être évaluée.BipartiteGraphQ@*AdjacencyGraph
, mais c'est encore plus long.JavaScript, 78 octets
Tableau d'entrée du tableau de 0/1, sortie vrai / faux.
Afficher l'extrait de code
la source
Pyth , 25 octets
Essayez-le en ligne!
Cela renvoie
-1
pour la fausse, et tout entier non négatif pour la vérité.Comment ça fonctionne
Cela fonctionne dans commit d315e19 , la version actuelle de Pyth que TiO a.
la source