Maximales Matching in bipartiten Graphen

Werbung
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
Herunterladen