Interaktives Graphentheorie-Lernen
Interaktives Graphentheorie-Lernen
Guest User
Using app without sign in
Prüfer für bipartite Graphen
Bestimmt, ob ein Graph mit zwei Farben gefärbt werden kann
Wählen Sie einen Algorithmus und generieren Sie Schritte, um die Visualisierung zu beginnen
Ein Graph ist bipartit, wenn sich seine Knoten in zwei Gruppen teilen lassen, sodass jede Kante zwischen den Gruppen verläuft, nie innerhalb einer. Die Bipartitheit zu prüfen ist gleichbedeutend damit, zu testen, ob der Graph mit zwei Farben gefärbt werden kann, oder ob er keinen Zyklus ungerader Länge enthält.
Ein BFS- oder DFS-Durchlauf färbt den Graphen unterwegs mit zwei Farben: den Startknoten färben, dann jedem entdeckten Nachbarn die Gegenfarbe geben. Verbindet eine Kante je zwei Knoten gleicher Farbe, existiert ein ungerader Zyklus und der Graph ist nicht bipartit. Jede Komponente muss geprüft werden. Der Test läuft in O(V + E).
Die bipartite Struktur liegt Zuordnungsproblemen zugrunde: Studierende zu Schulen, Aufträge zu Maschinen und Fahrgäste zu Fahrern. Empfehlungssysteme modellieren Nutzer und Artikel als die zwei Seiten eines bipartiten Graphen. Die Charakterisierung über ungerade Zyklen ist eine häufige Interview-Aufwärmfrage, die zu Themen des maximalen Matchings führt.
Ein Graph ist genau dann bipartit, wenn er sich mit zwei Farben färben lässt. Der Test ist also ein Durchlauf, der jeden Knoten entgegengesetzt zu seinem Vorgänger färbt und auf einen Konflikt achtet.
istBipartit(graph):
farbe = {} für alle Knoten
für jeden Knoten s ohne Farbe: // jede Komponente
farbe[s] = 0
schlange = [s]
solange die Schlange nicht leer ist:
u = schlange.entnehmen()
für jeden Nachbarn v von u:
wenn v keine Farbe hat:
farbe[v] = 1 - farbe[u]
schlange.einfügen(v)
sonst wenn farbe[v] == farbe[u]:
gib falsch zurück // ungerader Zyklus
gib wahr zurückDer Konflikt ist kein beliebiges Fehlersignal, sondern ein Beweis. Erhalten zwei benachbarte Knoten dieselbe Farbe, so bilden die Baumwege von beiden zu ihrem gemeinsamen Vorfahren zusammen mit der verbindenden Kante einen Zyklus ungerader Länge. Bipartite Graphen sind genau die Graphen ohne ungeraden Zyklus, die Konfliktkante ist also ein Zertifikat, das du dem Aufrufer zurückgeben kannst.
Färbe einen Vierer-Zyklus mit zwei Farben, füge dann eine Sehne hinzu und beobachte, wie derselbe Durchlauf ihn ablehnt.
Beispielgraph: Zuerst ein 4-Zyklus A-B, B-C, C-D, D-A. Dann derselbe Graph mit der zusätzlichen Sehne A-C.
Der 4-Zyklus ist bipartit mit den Teilen {A, C} und {B, D}; das Hinzufügen der Sehne A-C macht ihn nicht bipartit, erkannt an der Kante B-C. Beachte die allgemeine Regel, die das zeigt: jeder gerade Zyklus ist bipartit und jeder ungerade nicht, allein die Zykluslänge entscheidet also. Beachte auch, dass der Konflikt an der Kante B-C gemeldet wurde und nicht an der Sehne selbst, was normal ist, denn der Algorithmus meldet dort, wo der Widerspruch zuerst auftritt, nicht dort, wo du die Schuld vermuten würdest.
Zeit: O(V + E) · Speicher: O(V)
Das ist eine einzige BFS oder DFS mit einem Vergleich je Kante, kostet also genau einen Durchlauf. Jeder Knoten wird einmal gefärbt und jede Kante von jedem Endpunkt einmal geprüft. Der Speicher ist eine Farbe je Knoten plus Warteschlange oder Rekursionsstapel, beides O(V). Die Schleife über alle Knoten fügt asymptotisch nichts hinzu und ist das, was unzusammenhängende Graphen zum Funktionieren bringt. Es gibt kein schnelleres Verfahren, da die Entscheidung über Bipartitheit jede Kante betrachten muss: eine einzige ungeprüfte Kante könnte genau jene sein, die einen ungeraden Zyklus erzeugt.
Bipartitheit ist meist eine Vorbedingung und kein Ziel. Was du danach tust, hängt davon ab, warum du gefragt hast.
| Alternative | Vorzuziehen, wenn | Kosten |
|---|---|---|
| Hopcroft-Karp | Der Graph ist bipartit und du willst nun ein maximales Matching zwischen den beiden Teilen. | O(E·sqrt(V)) |
| Graphfärbung | Der Graph ist nicht bipartit und du brauchst die tatsächliche chromatische Zahl, die 3 oder mehr beträgt. | im Allgemeinen NP-schwer |
| Suche nach ungeraden Zyklen | Du willst den störenden Zyklus selbst, nicht nur ein Ja oder Nein. Rekonstruiere ihn an der Konfliktkante aus den BFS-Vorgängerzeigern. | O(V + E) |
| Union-Find mit Parität | Die Kanten treffen nach und nach ein und du willst die erste ablehnen, die die Bipartitheit bricht, sobald sie hinzukommt. | O(E·α(V)) |
Den ganzen Artikel lesen: Graph Algorithms in Coding Interviews
Verwandte Algorithmen: Breitensuche, Graphenfärbung, Maximaler Fluss