Matchings in Graphen - Lehrstuhl für Effiziente Algorithmen
Matchings in Graphen - Lehrstuhl für Effiziente Algorithmen
Matchings in Graphen - Lehrstuhl für Effiziente Algorithmen
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
Praktikum <strong>Algorithmen</strong>-Entwurf (Teil 5) 14.11.2005 4<br />
Nachbarkante e = {v, w} betrachtet: falls w noch nicht besucht wurde, setzt man<br />
level[w] = level[v] + 1 und fügt w h<strong>in</strong>ten an die Queue an; am Ende der Phase besteht<br />
die Queue aus Knoten, die <strong>in</strong> V 1 s<strong>in</strong>d.<br />
Die Breitensuche term<strong>in</strong>iert, wenn die Queue nach e<strong>in</strong>er Phase vom Typ 1 e<strong>in</strong>en freien Knoten<br />
w enthält (dann gibt es e<strong>in</strong>en augmentierenden Pfad der Länge level[w], der bei w endet, und<br />
es wird die anschließende Tiefensuche gestartet) oder wenn die Queue leer wird (dann gibt es<br />
ke<strong>in</strong>en augmentierenden Pfad und das aktuelle Match<strong>in</strong>g hat bereits maximale Kard<strong>in</strong>alität).<br />
1.2 Tiefensuche nach augmentierenden Pfaden<br />
Wenn bei der simultanen Breitensuche nach l Phasen e<strong>in</strong> freier Knoten aus V 2 erreicht wurde,<br />
so wissen wir jetzt, dass es m<strong>in</strong>destens e<strong>in</strong>en kürzesten augmentierenden Pfad der Länge l<br />
gibt, und wollen nun mittels Tiefensuche e<strong>in</strong>e maximale Menge solcher kürzester augmentierender<br />
Pfade berechnen. Genauer werden wir dazu nicht e<strong>in</strong>e e<strong>in</strong>zige Tiefensuche verwenden,<br />
sondern für jeden freien Knoten v aus V 1 e<strong>in</strong>e eigene Tiefensuche starten, um von v aus (falls<br />
möglich) e<strong>in</strong>en augmentierenden Pfad der Länge l zu f<strong>in</strong>den. Bei diesen Tiefensuchen betrachten<br />
wir ausschließlich Kanten, die den folgenden Bed<strong>in</strong>gungen genügen (andere Kanten<br />
werden ignoriert):<br />
• Ist der aktuelle Knoten u ∈ V 1 , so betrachten wir von u aus Kanten e = {u, w} mit<br />
e ∈ E \ M und level[w] = level[u] + 1.<br />
• Ist der aktuelle Knoten u ∈ V 2 , so betrachten wir von u aus Kanten e = {u, w} mit<br />
e ∈ M und level[w] = level[u] + 1.<br />
Erreicht e<strong>in</strong>e solche Tiefensuche von e<strong>in</strong>em freien Knoten v aus V 1 e<strong>in</strong>en freien Knoten w aus<br />
V 2 , so ist der zugehörige Pfad von v nach w e<strong>in</strong> kürzester augmentierender Pfad. In diesem<br />
Fall wird der Pfad sofort <strong>in</strong>vertiert (Kanten, die <strong>in</strong> M waren, werden aus M herausgenommen,<br />
und Kanten, die noch nicht <strong>in</strong> M waren, werden <strong>in</strong> M e<strong>in</strong>gefügt), alle Knoten u auf dem Pfad<br />
werden durch Setzen von level[u] = −1 für weitere Tiefensuchen gesperrt, und die nächste<br />
Tiefensuche wird beim nächsten freien Knoten aus V 1 gestartet. Läuft e<strong>in</strong>e Tiefensuche <strong>in</strong> e<strong>in</strong>e<br />
Sackgasse, d.h. es wurde noch ke<strong>in</strong> augmentierender Pfad gefunden und es gibt vom aktuellen<br />
Knoten u aus ke<strong>in</strong>e den obigen Bed<strong>in</strong>gungen genügende Kante mehr, so wird level[u] = −1<br />
gesetzt und die Tiefensuche am Vorgänger von u fortgesetzt. Die Level-Werte der Knoten<br />
werden während der Tiefensuchen nur dann verändert, wenn e<strong>in</strong> augmentierender Pfad oder<br />
e<strong>in</strong>e Sackgasse gefunden wurde: <strong>in</strong> diesem Fall wird durch Setzen des Level-Wertes auf −1<br />
erreicht, dass die betroffenen Knoten für den Rest der Tiefensuche ignoriert werden.<br />
1.3 Beispiel des Ablaufs e<strong>in</strong>er Iteration<br />
Der bipartite Graph G = (V 1 ∪ V 2 , E) mit V 1 = {1, 2, 3, 4, 5, 6} und V 2 = {a, b, c, d, e, f}<br />
und das aktuelle Match<strong>in</strong>g M seien wie folgt gegeben (gematchte Kanten s<strong>in</strong>d fett gezeichnet,<br />
freie Knoten s<strong>in</strong>d dick umrandet):