Maximales Matching in bipartiten Graphen Gegeben ist ein ungerichteter bipartiter Graph G = (L, R, E) als Adjazenzliste AdjG , mit der Knotenmenge V = L ∪ R, so dass alle Kanten zwischen L und R verlaufen. Es soll ein maximales Matching M für G berechnet werden. Die Initialisierung erfolgt mit M = ∅. Mit VM werden die Knoten bezeichnet, die Endpunkt einer Kante in M sind. Es werden Erweiterungspfade berechnet, so dass M vergrößert werden kann, solange, bis es keine Erweiterungspfade mehr gibt. Dann ist M maximal. Der folgende Algorithmus berechnet die Adjazenzliste AdjH eines Graphen H, den sogenannten hungerian tree für das aktuelle Matching M . Im Allgemeinen ist H allerdings kein Baum, sondern ein gerichteter azyklischer Graph, dessen Äste Erweiterungspfade sind. Mittels H können im Anschluss disjunkte Erweiterungspfade für das aktuelle Matching M konstruiert werden, und M damit simultan um alle so erhaltenen Erweiterungspfade vergrößert werden. Der Algorithmus durchsucht G wie bei einer Breitensuche. Startpunkte sind alle Knoten in L, die frei sind bzgl. dem aktuellen Matching M . Von diesen aus wird entlang alternierender Pfade bzgl. M gegangen. Wird ein freier Knoten in R erreicht, so hat man einen Erweiterungspfad gefunden. Mittels der Variablen Done wird die Suche dann nach dieser Iteration abgebrochen. D.h. es werden nur kürzeste Erweiterungspfade berechnet. Es werden zwei Queues QL und QR benützt, um alternierend die Knoten von L und R zu speichern, die gerade besucht werden. Die Kanten des hungerian tree H sind der Laufrichtung des Algorithmus entgegen gerichtet. Die Endpunkte bei der Suche werden in einem Feld E gespeichert und sind dann die Startknoten bei der Berechnung der Erweiterungspfade in H. Hungerian-Tree(G, M ) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 for each u ∈ V do color[u] ← white AdjH [u] ← nil E[u] = 0 Done ← False QL ← L − VM , QR ← ∅ repeat while QL 6= ∅ do u ← Dequeue(QL ) for each v ∈ AdjG [u] do if color[v] = white and (u, v) 6∈ M then color[v] ← gray Insert(AdjH [v], u) Enqueue(QR , v) else if color[v] = gray and (u, v) 6∈ M then Insert(AdjH [v], u) color[u] ← black while QR 6= ∅ do v ← Dequeue(QR ) if v ∈ VM then u ← Knoten mit (u, v) ∈ M if color[u] = white then Insert(AdjH [u], v) Enqueue(QL , u) color[v] ← black else E[v] ← 1, Done ← True until Done or QL = ∅ return AdjH , E