Ein zweigeteiltes Diagramm ist ein Diagramm, dessen Scheitelpunkte in zwei nicht zusammenhängende Gruppen unterteilt werden können, sodass keine Kante zwei Scheitelpunkte in derselben Gruppe verbindet. Ein Graph ist genau dann zweiteilig, wenn er zweifarbig ist.
Herausforderung
Ihre Aufgabe ist es, anhand der Adjazenzmatrix eines ungerichteten einfachen Diagramms zu bestimmen, ob es sich um ein zweigliedriges Diagramm handelt. Das heißt, wenn eine Kante die Eckpunkte i und j verbindet, sind sowohl der (i, j) als auch der (j, i) Eintrag der Matrix 1.
Da der Graph ungerichtet und einfach ist, ist seine Adjazenzmatrix symmetrisch und enthält nur 0 und 1.
Besonderheiten
Sie sollten eine N-mal-N-Matrix als Eingabe verwenden (in beliebiger Form, z. B. Liste der Listen, Liste der Zeichenfolgen, C-ähnlich int**
und Größe, abgeflachtes Array, unformatierte Eingabe usw.).
Die Funktion / das Programm sollte einen Wahrheitswert zurückgeben / ausgeben, wenn der Graph zweiteilig ist, und ansonsten falsch.
Testfälle
['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
Wertung
Builtins, die die Antwort direkt berechnen, sind gesperrt.
Das ist Code-Golf , also gewinnt das kürzeste Programm (in Bytes) bis Ende dieses Monats!
quelle
-1
für Falsch und für Wahr eine nicht negative ganze Zahl zurückgeben?0
-> Falsy,>0
-> Truthy wird im Allgemeinen durch Standardregeln für Wahrheiten / Falschheiten zugelassen.-1
und≥ 0
ist nicht so verbreitet, deshalb habe ich gefragt.Antworten:
Schale , 17 Bytes
Gibt eine positive Ganzzahl aus, wenn das Diagramm zweigeteilt ist
0
. Probieren Sie es online!Erläuterung
Dies ist ein Brute-Force-Ansatz: Durchlaufen Sie alle Untergruppen S von Scheitelpunkten und prüfen Sie, ob alle Kanten im Diagramm zwischen S und seinem Komplement liegen.
quelle
M = [[1,2,3],[4,5,6],[7,8,9]]
undS = [1,0,1]
(M
ist immer eine binäre Matrix im Programm, aber es ist einfacher, dies so zu erklären). Das Filtern jeder ZeileM
nachS
ergibt[[1,3],[4,6],[7,9]]
: Für jede Zeile entferne ich die Elemente an den Indizes, an denenS
eine 0 vorhanden ist. Dann negiere ich die zu erhaltendenS
Elemente[0,1,0]
und filtere danachM
, um zu erhalten[[4,6]]
: Die erste und die letzte Zeile haben 0 in den entsprechenden Indizes Also werden sie entfernt.Wolfram-Sprache (Mathematica) ,
2625 BytesProbieren Sie es online!
Wie es funktioniert
Bei gegebener Adjazenzmatrix A finden wir den Fixpunkt, bei dem wir mit B = A beginnen und dann B durch A 2 B ersetzen. Dabei werden gelegentlich Werte größer als 1 bis 1 abgeschnitten. Der k- te Schritt dieses Prozesses entspricht der
Clip
Ermittlung von Potenzen A 2k + 1 , in dem der Eintrag (i, j) die Anzahl der Pfade der Länge 2k + 1 vom Scheitelpunkt i bis j zählt; Daher hat der feste Punkt einen Eintrag ungleich Null (i, j), wenn wir in einer ungeraden Anzahl von Schritten von i nach j gehen können.Insbesondere hat die Diagonale des Fixpunkts nur dann Einträge ungleich Null, wenn sich ein Eckpunkt in einer ungeraden Anzahl von Schritten selbst erreichen kann: wenn es einen ungeraden Zyklus gibt. Die Kurve des Fixpunkts ist also genau dann 0, wenn der Graph zweiteilig ist.
Eine andere 25-Byte-Lösung dieser Form ist
Tr[#O@n//.x_:>#.#.x]===0&
, falls dies jemandem Ideen darüber gibt, wie die Byteanzahl noch weiter gesenkt werden kann.Frühere Bemühungen
Ich habe eine Reihe von Ansätzen für diese Antwort ausprobiert, bevor ich mich für diese entschieden habe.
26 Bytes: Matrixexponentiale
Beruht auch auf ungeraden Potenzen der Adjazenzmatrix. Da x * exp (x 2 ) x + x 3 + x 5/2 ist ! + x 7/4 ! + ..., wenn x eine Matrix A ist, hat dies einen positiven Term für jede ungerade Potenz von A, so dass es auch eine Nullspur gibt, wenn A einen ungeraden Zyklus hat. Diese Lösung ist für große Matrizen sehr langsam.
29 Bytes: große ungerade Leistung
Findet für eine n mal n-Matrix A A 2n + 1 und führt dann die Diagonalenprüfung durch. Hier werden
#~Table~Tr[2#!]
2n Kopien der Eingangsmatrix n#.##& @@ {a,b,c,d}
x n generiert und entpackt, wodurcha.a.b.c.d
2n + 1 Kopien der Matrix multipliziert werden.53 Bytes: Laplace-Matrix
Verwendet ein obskures Ergebnis in der Spektralgraphentheorie ( Proposition 1.3.10 in diesem PDF ).
quelle
Tr[#.Nest[#.#&,#,Tr[#!]]]<1&
. (Dies ist eine unglaubliche Antwort, die von Mal zu Mal besser wird!)BipartiteGraphQ@AdjacencyGraph@#&
MatrixExp
Ergebnisse in Form von nicht bewertetenRoot
Objekten zurückgegeben, die beim Hinzufügen nicht automatisch vereinfacht werden. DasN@
zwingt dazu, dieseRoot
numerisch zu berechnen, damit dann die Wahrhaftigkeit bewertet werden kann.BipartiteGraphQ@*AdjacencyGraph
, aber es ist noch länger.JavaScript, 78 Byte
Eingabearray des Arrays von 0/1, Ausgabe wahr / falsch.
Code-Snippet anzeigen
quelle
Pyth , 25 Bytes
Probieren Sie es online!
Dies
-1
ergibt eine falsche Zahl und eine nicht negative ganze Zahl für die Wahrheit.Wie es funktioniert
Dies funktioniert in commit d315e19 , der aktuellen Pyth-Version von TiO.
quelle