20.11.2014 Aufrufe

Matchings in Graphen - Lehrstuhl für Effiziente Algorithmen

Matchings in Graphen - Lehrstuhl für Effiziente Algorithmen

Matchings in Graphen - Lehrstuhl für Effiziente Algorithmen

MEHR ANZEIGEN
WENIGER ANZEIGEN

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):

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!