Inhalt 1 Elementare Algorithmen 2 Algorithmen für Graphen Einführung Tiefen- und Breitensuche Minimal Spannende Bäume Kürzeste Wege Matchings 3 Mathematische Algorithmen Theoretische Informatik 3 (SS 2007) Algorithmen für Graphen 75 Algorithmen für Graphen / Einführung 76 Inhalt 1 Elementare Algorithmen 2 Algorithmen für Graphen Einführung Tiefen- und Breitensuche Minimal Spannende Bäume Kürzeste Wege Matchings 3 Mathematische Algorithmen Theoretische Informatik 3 (SS 2007) Notation – ungerichtete Graphen G = (V , E): endlicher, ungerichteter Graph, ohne Schlaufen/Schlingen, wobei: V - eine endliche Menge von Knoten/Ecken ist und E - die Menge der Kanten ist. Hierbei gilt: ` ´ E ⊆ V2 := {u, v } ⊆ V | u 6= v . NG (v ): Nachbarn von v definiert durch: NG (v ) := N(v ) := {u ∈ V | {u, v } ∈ E}. degG (v ): Grad von v definiert durch degG (v ) := deg(v ) := |N(v )|. δ(G): Minimalgrad δ(G) := minv ∈V deg(v ) ∆(G): Maximalgrad ∆(G) := maxv ∈V deg(v ) α(G): U ⊆ V ist eine stabile Menge, wenn ` ´ es keine Kante von G mit beiden Endpunkten in U gibt, d.h. E ∩ U2 = ∅. Die Stabilitätszahl α(G) := max{|U| | U ist stabile Menge inG}. ω(G): U ⊆ V spannt eine Clique K|U| , wenn jede Kante mit beiden Endpunkten in U in ` ´ ` ´ E ist, d.h. E ∩ U2 = U2 . Die Cliquenzahl ω(G) := max{|U| | U ist Clique in G}. χ(G): f : V → N ist eine Färbung von G, wenn f (u) 6= f (v ) für alle {u, v } ∈ E. G ist k -färbbar, falls eine Färbung f : V → [k ] existiert. Die chromatische Zahl χ(G) = min{k ∈ N | G ist k-färbbar}. Ein Graph ist bipartit, wenn χ(G) ≤ 2. Theoretische Informatik 3 (SS 2007) Algorithmen für Graphen / Einführung 77 Notation – ungerichtete Graphen – Teil 2 Subgraph: Ein Graph H = (V 0 , E 0 ) heißt Sub-/Teil-/Untergraph von G = (V , E), falls ` 0´ V 0 ⊆ V und E 0 ⊆ E. H ist ein induzierter Subgraph, falls E 0 = E ∩ V2 , hierfür ` 0´ schreiben wir auch H = G[V 0 ] := (V 0 , E ∩ V2 ). Weg: Folge von (nicht notwendig verschiedenen) Knoten v0 , . . . , v` , so dass {vi , vi+1 } ∈ E für 0 ≤ i < `. Die Länge des Weges ist die Anzahl der Kanten, also `. Ein Weg v0 , . . . , v` heißt auch v0 -v` -Weg. Pfad: Weg bei dem alle Knoten paarweise verschieden sind. Ein Graph `V ´G = (V , E) heißt zusammenhängend, falls es für alle Paare {u, v } ∈ 2 einen u-v -Pfad gibt. Zykel: ist ein u-v -Weg mit u = v . Kreis: ist ein Zykel v0 , v1 . . . , v`−1 , v0 für den v0 , v1 . . . , v`−1 paarweise verschieden sind. Ein Graph G = (V , E) heißt kreisfrei oder Wald, falls er keinen Kreis enthält. Baum: ist ein zusammenhängender Wald. spezielle Graphen: Kn : Clique mit/vollständiger Graph auf n ∈ N Knoten. _ Ka,b : vollständiger bipartiter Graph (A∪B, E), wobei |A| = a, |B| = b und E = {{u, v } | u ∈ A, v ∈ B}. Pn : Pfad der Länge n, also hat Pn genau n Kanten und n + 1 Knoten. Cn : Kreis der Länge n, also hat Cn genau n Kanten und n Knoten. Theoretische Informatik 3 (SS 2007) Algorithmen für Graphen / Einführung 78 Warm-up Lemma 13. In einem ungerichteten Graphen G = (V , E) ist die Anzahl der Knoten mit ungeradem Grad gerade. P Beweis: Die Summe aller Knotengrade ist v ∈V deg(v ) = 2|E| gerade. Somit ist die Summe der Knotengrade der Knoten mit ungeradem Grad gerade und die Aussage folgt. Lemma 14. In einem ungerichteten Graphen G = (V , E) gilt χ(G) ≥ |V |/α(G). Beweis: Sei χ(G) und f : V → [k] eine k -Färbung. Für j ∈ [k ] ist f −1 (j) eine stabile Menge Pk k :=−1 in G und j=1 |f (j)| = |V |. Also ist α(G) ≥ |V |/k . Lemma 15. Jeder ungerichtete Graph G = (V , E) mit δ(G) ≥ 2 enthält einen Kreis der Länge mindestens δ(G) + 1. Beweis: Sei P = v0 . . . v` ein längster Pfad in G. D.h. N(v0 ) liegt vollständig auf dem P, da sonst P verlängert werden könnte. Sei j der größte Index, so dass {v0 , vj } ∈ E. Da alle Nachbarn von v0 auf P liegen, muss j ≥ deg(v0 ) ≥ δ(G) ≥ 2. Somit ist v0 . . . vj ein Kreis der Länge j + 1. Theoretische Informatik 3 (SS 2007) Algorithmen für Graphen / Einführung 79 Notation – gerichtete Graphen D = (V , A): endlicher, gerichteter Graph oder Digraph, wobei: V - eine endliche Menge von Knoten/Ecken ist und A - die Menge der gerichteten Kanten ist. Hierbei gilt: E ⊆ V × V := (u, v ) | u, v ∈ V , wobei Schlingen, d.h. Kanten vom Typ (u, u), erlaubt sind. ND+ (v ): deg+ D (v ): ND− (v ): deg− D (v ): Nachfolger von v definiert durch: ND+ (v ) := N + (v ) := {u ∈ V | (v , u) ∈ A}. + + Ausgangsgrad von v definiert durch deg+ D (v ) := deg (v ) := |N (v )|. Vorgänger von v definiert durch: ND− (v ) := N − (v ) := {u ∈ V | (u, v ) ∈ A}. − − Eingangsgrad von v definiert durch deg− D (v ) := deg (v ) := |N (v )|. Weg: Folge von (nicht notwendig verschiedenen) Knoten v0 , . . . , v` , so dass (vi , vi+1 ) ∈ A für 0 ≤ i < `. Gerichtete Pfade, Zykel und Kreise werden analog zum ungerichteten Fall definiert. Zusammenhang: D = (V , `A)´ist schwach zusammenhängend, wenn es für jedes Paar {u, v } ∈ V2 wenigstens einen gerichteten Pfad (in eine Richtung) zwischen u und v gibt. D = (V , `A)´ist stark zusammenhängend, wenn es für jedes Paar {u, v } ∈ V2 sowohl einen gerichteten u-v -Pfad, als auch einen gerichteten v -u-Pfad gibt. Theoretische Informatik 3 (SS 2007) Algorithmen für Graphen / Einführung 80 Weitere Spielarten gewichtete Graphen: Zusätzlich zum Graphen bzw. Digraphen gibt es eine Gewichtsfunktion w von den Kanten in die reelen Zahlen. Simulation von Straßennetzwerken: Die Knoten sind Kreuzungen, die Kanten sind Straßen und die Gewichtsfunktion stellt Reisekosten oder Reisedauer dar. Netzwerke: Gewichteter Digraph mit zwei ausgezeichneten Knoten s und t. Simulation von Flüssen: Die Kanten sind Rohrleitungen mit Kapazitäten die durch w gegeben sind. Ziel ist es möglichst viel von s nach t zu pumpen. Multigraphen: Graphen in denen Mehrfachkanten erlaubt sind. D.h. die Kantenmenge ist eine Multimenge. Hypergraphen: Graphen“ in denen eine (Hyper)Kante aus mehr als 2 Knoten ” bestehen kann. Z.B. in einem k-uniformen Hypergraphen besteht jede Kante aus genau k Knoten. 2-uniforme Hypergraphen sind dann wieder einfache Graphen. ... Theoretische Informatik 3 (SS 2007) Algorithmen für Graphen / Einführung 81 Datenstrukturen für Graphen Adjazenzmatrix für G = (V , E) bzw. D = (V , A) Knoten werden von 1 bis |V | =: n durchnummeriert Die n × n-Matrix A mit Einträgen: 1, {vi , vj } ∈ E aij = 0, sonst bzw. 1, (vi , vj ) ∈ A aij = 0, sonst. ist die Adjazenzmatrix. Für ungerichtete Graphen ist die Adjazenzmatrix symmetrisch mit aii = 0 für i ∈ [n]. Adjazenzlisten für G = (V , E) bzw. D = (V , A) Für jeden Knoten wird eine Liste mit seinen Nachbarn verwaltet. Im gerichteten Fall, verwaltet man entweder nur die Liste der Nachfolger oder zusätzlich eine weitere für die Vorgänger. Falls die Anzahl der Knoten gleichbleibt organisiert man die Adjazenzlisten in einem Feld, d.h. die Feldelemente sind die Adjazenzlisten. Falls die Anzahl der Knoten sich dynamisch ändert, so werden die Adjazenzlisten typischerweise in einer Liste verwaltet. Theoretische Informatik 3 (SS 2007) Algorithmen für Graphen / Einführung 82 Datenstrukturen für Graphen – Aufwand Adjazenzmatrix Adjazenzlisten (einfach) Adjazenzlisten O(|V | ) O(|V |) O(|V |) O(1) O(1) O(1) O(|V | + |E|) O(1) O(|V |2 ) O(1) O(|V |) O(|V |) O(|V | + |E|) O(1) O(|V |) O(1) O(1) O(|V |) Speicherbedarf Knoten einfügen Knoten entfernen Kante einfügen Kante entfernen Test auf Kante 2 Bemerkung. Die Verbesserung beim Löschen in der Adjazenzlistendarstellung erhält man, indem man für jede Kante mit jeweils einem Zeiger auf die Position in der Adjazenzliste ihre jeweiligen Endknoten mitabspeichert. Theoretische Informatik 3 (SS 2007) Algorithmen für Graphen / Einführung 83 Algorithmen für Graphen / Tiefen- und Breitensuche 84 Inhalt 1 Elementare Algorithmen 2 Algorithmen für Graphen Einführung Tiefen- und Breitensuche Minimal Spannende Bäume Kürzeste Wege Matchings 3 Mathematische Algorithmen Theoretische Informatik 3 (SS 2007) Tiefensuche (depth-first-search) DFS(G = (V , E)) 1 Für alle Knoten v ∈ V : DFS-visit(G = (V , E), v ) 1 Setze visited(v ) := true. Für alle Knoten u ∈ N(v ) 2 Setze visited(v ) := false. 2 3 Setze π(v ) := nil. 3 4 Für alle Knoten v ∈ V : 5 Falls visited(v ) = false: 6 DFS-Visit(G, v ). Falls visited(u) = false: 4 Setze π(u) := v . 5 DFS-Visit(G, u). Bemerkung. In π(v ) wird immer der Knoten abgelegt, über den v bei der Tiefensuche zum erstenmal erreicht wurde. Tiefensuchwald Der Algorithmus DFS lässt sich auch auf gerichteten Graphen implementieren, in dem N(v ) durch N + (v ) ersetzt wird. Theoretische Informatik 3 (SS 2007) Algorithmen für Graphen / Tiefen- und Breitensuche 85 Tiefensuche Satz 16. Der Algorithmus DFS durchläuft alle Knoten und Kanten eines ungerichteten Graphen und hat eine Laufzeit von O(|V | + |E|), wenn G mit Adjazenzlisten gegeben ist. Beweis: Offensichtlich wird das Feld visited für jeden Knoten u genau einmal auf true gesetzt, und zwar genau dann, wenn der Knoten u besucht“ wird. Außerdem ” werden in Zeile 2 der Prozedur DFS-visit alle zu u inzidenten Kanten betrachtet. Wir bestimmen nun die Laufzeit des Algorithmus DFS. Die Prozedur DFS-visit wird nur für unbesuchte Knoten aufgerufen und der unbesuchte Knoten wird sofort als besucht markiert.Somit wird DFS-visit für jeden Knoten genau einmal aufgerufen. Innerhalb von DFS-visit wird die for-Schleife für die deg(v ) Nachbarn des aktuellen P Knotens v durchlaufen. Insgesamt sind das v ∈V deg(v ) = 2|E| Durchläufe. Die Gesamtlaufzeit des Algorithmus DFS beträgt somit O(|V | + |E|). Bemerkung. Die Anzahl der Zusammenhangskomponenenten eines ungerichteten Graphen kann einfach mit DFS bestimmt werden. In der Tat gilt: Die Anzahl der Zusammenhangskomponenten von G ist die Anzahl der Knoten v mit π(v ) = nil nach dem Aufruf von DFS. Theoretische Informatik 3 (SS 2007) Algorithmen für Graphen / Tiefen- und Breitensuche 86 Tiefensuchbaum/-wald Definition 17. Sei G = (V , E) ein Graph und H = (U, F ) ein Untergraph. H heißt spannend, falls U = V . H ist ein Spannbaum (bzw. spannender Baum) von G, falls H ein Baum ist und U = V . Sei G = (V , E) und π das Feld nach dem Ausführen von DFS(G). Dann definieren wir den entsprechenden spannenden Vorgängerteilgraph Tπ = (V , Eπ ) von G durch: Eπ := {v , π(v )} | v ∈ V und π(v ) 6= nil . Beachte: G kann verschiedene Vorgängergraphen haben. Der Vorgängergraph hängt von der Reihenfolge ab, in der die Knoten in Schritt 4 von DFS und Schritt 2 von DFS-visit betrachtet werden. Lemma 18. Für jeden Graphen G ist der Vorgängerteilgraph Tπ einer Tiefensuche ein spannender Wald. Darüberhinaus ist Tπ ein Spannbaum von G, falls G zusammenhängend ist. Beweis: Es seien die Knoten des Graphen gemäß ihrer Reihenfolge, in der sie besucht werden nummeriert. Dann gilt, falls π(u) 6= nil, dann ist die Nummer von π(u) kleiner der Nummer von u, da π(u) bereits besucht wurde. Somit ist Tπ kreisfrei. Falls G zusammenhängend ist, dann ist nur π(v ) = nil für den ersten Knoten v , für den DFS-visit in Zeile 6 von DFS aufgerufen wird. D.h. |Eπ | = |V | − 1 und, da Tπ kreisfrei ist, ist Tπ ein Baum (siehe Übung). Theoretische Informatik 3 (SS 2007) Algorithmen für Graphen / Tiefen- und Breitensuche 87 Querkanten? Definition 19. Sei T = (V , F ) ein Baum mit Wurzel w. Für zwei Knoten u und v ∈ V sagen wir, u ist ein Vorgänger von v bzw. v ist ein Nachfolger von u, falls der Knoten u auf dem eindeutigen w-v -Pfad liegt. Satz 20. Sei G = (V , E) ein zusammenhängender Graph und Tπ = (V , Eπ ) ein Tiefensuchbaum von G und {x, y} ∈ E. Dann gilt: x ist ein Vorgänger von y (bzw. umgekehrt) in T . Der Satz bedeutet, dass es keine Kanten in G zwischen disjunkten Teilbäumen von T geben kann (so genannte Querkanten). Beweis: Es seien die Knoten des Graphen gemäß ihrer Reihenfolge, in der sie besucht werden nummeriert. Sei {x, y} eine Kante in G. O.B.d.A. wurde x vor y besucht. Dann muss y entdeckt“ und besucht werden, bevor x abgearbeitet“ ist, da y ” ” ein Nachbar von x ist, der nicht vor x besucht wurde. Dies bedeutet, entweder wird y direkt von x aus besucht und {x, y} ist eine Baumkante, oder y wird von einem Nachfolger von x aus besucht und ist somit auch ein Nachfolger von x. Theoretische Informatik 3 (SS 2007) Algorithmen für Graphen / Tiefen- und Breitensuche 88 Breitensuche (breadth-first-search) Theoretische Informatik 3 (SS 2007) Algorithmen für Graphen / Tiefen- und Breitensuche 89 Breitensuche Eine weitere Art, einen Graphen zu durchlaufen, ist die Breitensuche (BFS). Ähnlich wie mit der Tiefensuche kann man so die Zusammenhangskomponenten eines gegebenen Graphen; einen spannenden Baum in zusammenhängenden Graphen berechnen. Darüberhinaus kann man mit der Breitensuche effizient die kürzesten Wege von einem Startknoten s zu allen anderen Knoten v ∈ V berechnen. Der kürzeste Abstand dist(s, v ) des Knotens v vom Startknoten s in einem ungewichteten Graphen G = (V , E) ist die minimale Anzahl von Kanten über alle s-v -Pfade in G. Wenn es keinen s-v -Pfad gibt, dann sei dist(s, v ) = ∞. Ein Pfad der Länge dist(s, v ) wird als kürzester Pfad bezeichnet. Theoretische Informatik 3 (SS 2007) Algorithmen für Graphen / Tiefen- und Breitensuche 90 BFS A LGORITHMUS: BFS(G, s) Eingabe: Gesucht: 1 Ein Graph G = (V , E) und ein Startknoten s ∈ V dist(s, v ) und π(v ) für alle v ∈ V . Für alle v ∈ V : Setze dist(s, v ) := ∞ und π(v ) := nil. 2 3 Setze dist(s, s) := 0. 4 Initialisiere Warteschlange Q und füge s in Q ein. 5 Solange Q nicht leer ist: 6 Entnehme ein Element v aus Q. 7 Für alle u ∈ NG (v ): Falls dist(s, u) = ∞: 8 9 Setze π(u) := v . 10 Setze dist(s, u) := dist(s, v ) + 1. 11 Füge u in Q ein. Theoretische Informatik 3 (SS 2007) Algorithmen für Graphen / Tiefen- und Breitensuche 91 Analyse der Breitensuche Satz 21. Für einen Graphen G = (V , E) läuft BFS in Zeit O(|V | + |E|), wenn G mit Adjazenzlisten gegeben ist. Ferner gilt: 1 2 dist(s, v ) ist die Länge eines kürzesten s-v -Pfades in G (bzw. ∞, falls kein s-v -Pfad existiert). Wenn G zusammenhängend ist, ist der Vorgängergraph Tπ = (V , Eπ ) Eπ := {v , π(v )} | v ∈ V \ {s} ein Spannbaum von G. 3 Ein kürzester s-v -Weg kann in O(dist(s, v )) aus π konstruiert werden. Beweis: Laufzeit: Die Initialisierung in Schritt 1-2 kostet Zeit O(|V |). Da jeder Knoten nur einmal in Q eingefügt wird (bevor u in Q eingefügt wird, wird in Schritt 10 dist(s, u) auf einen Wert < ∞ gesetzt), kann er auch nur einmal entnommen werden. D.h. die for-Schleife in 7 betrachtet für jeden Knoten jeden seiner Nachbarn genau einmal und wird insgesamt höchstens X degG (v ) = 2|E| v ∈V mal durchlaufen, so dass die Laufzeit der Schritte der while-Schleife 5–11 O(|E|) ist. Insgesamt erhalten wir O(|V | + |E|). Theoretische Informatik 3 (SS 2007) Algorithmen für Graphen / Tiefen- und Breitensuche 92 Analyse der Breitensuche – Teil 2 zu 1) Um 1) zu beweisen, bemerken wir, dass nach Konstruktion (Schritt 5) für alle v ∈ V mit π(v ) 6= nil gilt, dass dist(s, v ) = dist(s, π(v )) + 1 ≥ 1. Folgt man daher dem Pfad v , π(v ), π(π(v )), . . . (1) so nimmt in jedem Schritt der dist(s, ·)-Wert“ um 1 ab. Weil s der einzige Knoten mit ” dist(s, ·)-Wert“ 0 ist, endet der Pfad in s und hat Länge dist(s, v ). ” Andererseits haben wir zu zeigen, dass es keinen kürzeren s-v -Pfad als (1) gibt. Um dies zu zeigen, stellen wir fest, dass die dist(s, ·)-Werte“ der Knoten in Q sich zu jedem Zeitpunkt ” um höchstens eins unterscheiden, wobei die Knoten mit den kleineren dist(s, ·)-Werten“ ” vorn (in Q) stehen. Daraus folgt, dass ∀ {x, y } ∈ E : dist(s, x) ≤ dist(s, y ) + 1. (2) Sei nun s = u0 , . . . , uk = v irgendein s-v -Pfad. Dann folgt aus (2), dass dist(s, v ) = dist(s, uk ) ≤ dist(s, uk −1 ) + 1 ≤ dist(s, uk −2 ) + 2 · · · ≤ dist(s, u0 ) + k = dist(s, s) + k = k , weshalb der Pfad (1) der Länge dist(s, v ) ein kürzester s-v -Pfad ist. zu 2) Die zweite Aussage ist eine unmittelbare Konsequenz aus der Tatsache, dass (1) ein s-v -Pfad ist. zu 3) Da der Pfad in (1) ein kürzester s-v -Pfad ist, kann ein kürzester Pfad in O(dist(s, v )) ausgegeben werden. Theoretische Informatik 3 (SS 2007) Algorithmen für Graphen / Tiefen- und Breitensuche 93 Algorithmen für Graphen / Minimal Spannende Bäume 94 Inhalt 1 Elementare Algorithmen 2 Algorithmen für Graphen Einführung Tiefen- und Breitensuche Minimal Spannende Bäume Kürzeste Wege Matchings 3 Mathematische Algorithmen Theoretische Informatik 3 (SS 2007) Das Problem des minimalen Spannbaumes Bis jetzt betrachteten wir nur ungewichtete Graphen und wir haben gesehen, dass man mittels DFS oder BFS spannende Bäume in einem zusammenhängenden Graphen in Zeit O(|V | + |E|) berechnen kann. Wir wollen nun Algorithmen kennenlernen, die minimal spannende Bäume in gewichteten Graphen berechnen können, d.h. spannende Bäume, deren Gesamtlänge/-gewicht minimal ist. Problem: minimal spannender Baum Gegeben: Gesucht: zusammenhängender Graph G = (V , E) mit w : E → R P spannender Baum T = (V , F ), der w(T ) := e∈F w(e) minimiert Anwendungen: Vernetzung von Rechnern, Design von Schaltkreisen, Design von preiswerten, zusammenhängenden Graphen“ ” Theoretische Informatik 3 (SS 2007) Algorithmen für Graphen / Minimal Spannende Bäume 95 Algorithmus von Kruskal ` ´ Für einen Graphen G = (V , E) und f ∈ V2 , sei G + f der Graph (V , E ∪ {f }), den wir erhalten, wenn wir f als Kante zu G hinzufügen, falls es noch keine Kante in G war. A LGORITHMUS: Kruskal(G, w) Eingabe: Gesucht: 1 zusammenhängender Graph G = (V , E) mit Kantengewichten wP : E →R Spannbaum T = (V , F ) von G mit minimalem Gewicht w(T ) := e∈F w(e) Sortiere die Kanten E von G nach aufsteigenden Gewichten: w(e1 ) ≤ w(e2 ) ≤ · · · ≤ w(em ). 2 Initialisiere T = (V , ∅). 3 Für i = 1 bis m: 4 5 Falls T + ei kreisfrei ist: Setze T := T + ei . Theoretische Informatik 3 (SS 2007) Algorithmen für Graphen / Minimal Spannende Bäume 96 Korrektheit von Kruskal Lemma 22. Kruskal berechnet einen minimalen Spannbaum von (G, w). Beweis: Sei T die Ausgabe von Kruskal. Die Konstruktion stellt sicher, dass T kreisfrei ist. Weil ferner G zusammenhängend ist, trifft dasselbe auf T zu, so dass T ein spannender Baum ist. Für einen beliebigen spannenden Baum T 0 von G definieren wir µ(T 0 ) := min{1 ≤ i ≤ m := |E| | ei liegt in T , aber nicht in T 0 } (mit der Konvention, dass µ(T ) = ∞). Ferner sei T ∗ ein minimaler Spannbaum von G, für den der Wert µ(T ∗ ) größtmöglich ist. Falls T = T ∗ , ist T ein minimal spannender Baum. Wir nehmen nun für einen Widerspruchsbeweis an, dass T 6= T ∗ . Sei 1 ≤ i ≤ m minimal mit der Eigenschaft, dass ei zu T , aber nicht zu T ∗ gehört. Dann enthält T ∗ + ei einen Kreis C, der wiederum eine Kante ej enthält, welche nicht zu T gehört. Es gilt j > i, weil T ∗ alle Kanten aus der Menge {e1 , . . . , ei−1 } enthält, welche zu T gehören. Dies impliziert, dass w(ej ) ≥ w(ei ). Daher ist T ∗∗ = T ∗ − ej + ei ebenfalls ein minimal spannender Baum von G. Aber da µ(T ∗∗ ) > i = µ(T ∗ ), erhalten wir einen Widerspruch zur Wahl von T ∗ . Dieser zeigt, dass T = T ∗ . Theoretische Informatik 3 (SS 2007) Algorithmen für Graphen / Minimal Spannende Bäume 97 Laufzeit von Kruskal Satz 23. Sei G ein Graph mit n Knoten und m Kanten. Kruskal bestimmt in Zeit O((m + n) log n) einen minimal spannenden Baum. Beweis: Dass die Ausgabe von Kruskal ein minimal spannender Baum ist, zeigt das letzte Lemma. In Bezug auf die Laufzeit bemerken wir, dass n − 1 ≤ m, weil G zusammenhängend ist. Die Sortieroperation im ersten Schritt kann mit MergeSort in Zeit O(m log m) ≤ O(m log n2 ) = O(m log n) ausgeführt werden. Die Laufzeit der Schritte 3–5 ist ebenfalls O(m + n log n), wenn man den Test auf Kreisfreiheit wie folgt implementiert: zu jedem Knoten wird ein Eintrag angelegt, der die Nummer seiner Zusammenhangskomponente in dem aktuellen Wald T enthält; anfangs hat T n Komponenten, die von 1, . . . , n numeriert sind. Jedesmal, wenn eine Kante e = {u, v } zu T hinzugefügt wird, werden die Komponenten von u und v vereinigt. Die Komponentennummern werden entsprechend aktualisiert, indem diejenigen in der kleineren Komponente durch die Nummer der größeren Komponente ersetzt werden. Auf diese Art ändert sich für jeden Knoten höchstens log n-mal die Komponentennummer, was auf die gewünschte Laufzeit O(m + n log n) führt. Somit ist die Gesamtlaufzeit O(m log n + m + n log n) = O((m + n) log n). Theoretische Informatik 3 (SS 2007) Algorithmen für Graphen / Minimal Spannende Bäume 98 Bemerkungen 1926 wurde der erste Algorithmus für das minimale Spannbaumproblem von Borůvka vorgestellt. Seine Veröffentlichung war in tschechisch und wurde leider viele Jahre übersehen. 1956 stellte Kruskal den hier angegebenen Algorithmus vor. 1957 wurde ein weiterer Algorithmus von Prim entwickelt. Allerdings stellte sich später heraus, dass dieser Algorithmus bereits 1930 von Jarnı́k entdeckt wurde. Beim Jarnı́k-Prim Algorithmus wird auch in |V | − 1 Schritten jeweils eine leichteste“ Kante ausgewählt. Im Gegensatz zu Kruskals Algorithmus bilden die ” bereits ausgewählten Kanten zu jedem Zeitpunkt einen Baum. In jedem Schritt wird immer die Kante ausgewählt, welche einen Baumknoten mit einem isolierten Knoten verbindet und dabei minimales Gewicht hat. Mit Hilfe von sogenannten Fibonacci-Heaps, lässt sich der Jarnı́k-Prim Algorithmus mit einer Laufzeit O(|E| + |V | log |V |) implementieren. Der zur Zeit schnellste bekannte Algorithmus ist von Chazelle aus dem Jahre 1997. Die Laufzeit von Chazelles Algorithmus ist O(|E| · β(|V |, |E|)), wobei β die inverse Ackermann-(Péter)-Funktion ist (siehe Theoretische Informatik 2). Theoretische Informatik 3 (SS 2007) Algorithmen für Graphen / Minimal Spannende Bäume 99 Algorithmen für Graphen / Kürzeste Wege 100 Inhalt 1 Elementare Algorithmen 2 Algorithmen für Graphen Einführung Tiefen- und Breitensuche Minimal Spannende Bäume Kürzeste Wege Matchings 3 Mathematische Algorithmen Theoretische Informatik 3 (SS 2007) Kürzeste Wege in Graphen Ausgangspunkt Gegeben ein gerichteter Graph mit nichtnegativen Kantengewichten. Wie lässt sich ein kürzester Pfad zwischen zwei Knoten effizient berechnen, sofern er existiert? (Länge eines Pfades: Summe seiner Kantengeichte) ungewichteter Fall: Breitensuche Motivation Wegeberechnung in einem Navigationsgerät Fahrplanauskunft bei der Deutschen Bahn ... und viele weitere Anwendungen Edsger Wybe Dijkstra (1930–2002, niederländischer Informatiker) Algorithmus von Dijkstra (1959) strukturierte Programmierung speisenden Philosophen Semaphoren Theoretische Informatik 3 (SS 2007) Algorithmen für Graphen / Kürzeste Wege 101 Algorithmus von Dijkstra (single-source shortest-path problem) Dijkstra(G = (V , A), w, s), w : A → Q+ ∪ {0}, s ∈ V 1 Für alle Knoten x ∈ V \ {s}: Setze x.Abstand := ∞; π(s) := nil 2 Setze s.Abstand := 0 3 Setze Q := V 4 Solange Q 6= ∅: 5 Setze x := Knoten in Q, der .Abstand minimiert: 6 Q := Q \ {x} 7 Für alle Knoten y ∈ N + (x) ∩ Q: 8 Falls x.Abstand +w((x, y )) < y .Abstand 9 y .Abstand := x.Abstand +w((x, y )). 10 π(y) := x. Theoretische Informatik 3 (SS 2007) Algorithmen für Graphen / Kürzeste Wege 102 Beweis Korrektheit Satz 24. Der Algorithmus Dijkstra berechnet einen kürzesten s-t-Pfad für alle Knoten t ∈ V . Beweis: Induktion über Anzahl aus Q entfernter Knoten. Behauptung: Wenn x ∈ V aus Q entfernt wird, gilt x.Abstand = dist(s, x). IA) gilt für s, da s.Abstand = 0. IS) x wird aus Q entfernt. Zu Zeigen: dist(s, x) = x.Abstand. Wegen Zeile 7–8 existiert s-x-Pfad. Also gilt dist(s, x) ≤ x.Abstand. Betrachte einen kürzesten s-x-Pfad s = v1 , . . . , vk = x. betrachte beliebigen Index i mit vi ∈ / Q, vi+1 ∈ Q. Existiert, da s ∈ / Q, x ∈ Q. Es gilt vi .Abstand = dist(s, vi ) (IV) und vi+1 .Abstand ≤ dist(s, vi ) + w((vi , vi+1 )) (Zeile 8). x wird aus Q entfernt, da er .Abstand minimiert. x.Abstand ≤ vi+1 .Abstand k −1 X ≤ dist(s, vi ) + w((vi , vi+1 )) + w((vλ , vλ+1 )) = dist(s, x) λ=i+1 | {z } Restpfad hat Gewicht ≥ 0 Theoretische Informatik 3 (SS 2007) Algorithmen für Graphen / Kürzeste Wege 103 Laufzeitanalyse Laufzeit in Abhängigkeit der Datenstrukturen EM(n): Laufzeit von Extract-Min bei n Elementen. DK (n): Laufzeit von Decrease-Key bei n Elementen. In(n): Laufzeit von Insert bei n Elementen. O(n) + n · O(In(n)) + | {z } | {z } 1 = 3 n X i=1 0 1 B C + @O(EM(n)) + deg (i) · O(DK (n))A | {z } | {z } | {z } 5−6 7 n · O(In(n)) + n · O(EM(n)) + O(DK (n)) 8 n X deg + (i) i=1 = O(n(In(n) + EM(n)) + m · O(DK (n))) Theoretische Informatik 3 (SS 2007) Algorithmen für Graphen / Kürzeste Wege 104 weiteres zur Laufzeit Laufzeit in Abhängigkeit der Datenstrukturen Listen: O(n2 ) + O(m) = O(n2 ) binäre Heaps: O(n log(n)) + O(m log(n)) = O((n + m) log(n)) Fibonacci-Heaps: O(m + n log(n)) (In(n) = DK (n) = O(1), EM(n) = O(log(n))) Wann ist welche Datenstruktur geeigneter? dichte Graphen (m = Θ(n2 )) : Listen sind geeigneter dünne Graphen (m = O(n)) : binäre Heaps (extremer Zeitgewinn) Fibonacci-Heaps sind erst bei sehr großen Graphen mit mittlerer Dichte schneller. Theoretisch optimale Laufzeit für den Algorithmus von Dijkstra: ist der Graph ein Stern und startet man vom Mittelpunkt, so ergibt sich ein weiteres Sortierverfahren. Offene Frage Existiert Algorithmus mit Laufzeit O(n + m)? Theoretische Informatik 3 (SS 2007) Algorithmen für Graphen / Kürzeste Wege 105 Varianten und Erweiterungen Bemerkung Pfade können analog zum Vorgängergraph Tπ (vgl. Breitensuche) konstruiert werden. kürzester s-t-Pfad Stoppen, wenn t aus Q entfernt wird Skizzierung einer möglichen Verbesserung: 1. Suche von beiden Seiten. Benutze dazu zwei Queues Qs und Qt . 2. Halte an, wenn ein Knoten x sowohl aus Qs als auch Qt entfernt wurde. 3. Verbinde die beiden Pfade geeignet: dist(s, t) = min{dist(s, x) + dist(x, t), min {dist(s, u) + w((u, v )) + dist(v , t)}} (u,v )∈A u∈V \Qs v ∈V \Qt V s Theoretische Informatik 3 (SS 2007) x V−Qs V−Qt t Algorithmen für Graphen / Kürzeste Wege 106 Varianten und Erweiterungen II Praxiseinsatz Der Algorithmus von Dijkstra wird oft in der Praxis eingesetzt, entweder wie hier vorgestellt oder als Verfeinerung (z.B. A∗ -Algorithmus) negative Kantengewichte notwendige Voraussetzung für Dijkstra: alle Kanten nichtnegativ bei negativen Kantengewichten gibt es zwei Fälle Existieren Kreise mit negativem Gewicht? ja nein NP-vollständig Bellman-Moore-Algorithmus in O(nm). Theoretische Informatik 3 (SS 2007) Algorithmen für Graphen / Kürzeste Wege 107 kürzester Pfad zwischen je zwei Knoten (all-pairs shortest-path problem) Dynamische Programmierung Herleitung Rekursionsformel berechne neue optimale Lösung aus bereits berechneten optimalen Teillösungen. Sei V = {1, . . . , n} und ein Pfad v1 , v2 , . . . , vk gegeben. Die Knoten v2 , . . . , vk−1 heißen innere Knoten. di,j (k) : Länge eines kürzesten Pfades von i nach j, dessen inneren Knoten alle aus 1, . . . , k stammen. Offensichtlich gilt di,j (k) ≥ di,j (k + 1). Ziel: bestimme di,j (n) für alle 1 ≤ i, j ≤ n. k+1 di,j (k + 1) := min{di,j (k), di,k+1 (k) + dk +1,j (k)} Knoten mit Index < k j i Theoretische Informatik 3 (SS 2007) Beweis: Fallunterscheidung. Wenn keine Kreise mit negativem Gewicht existieren, so ist ein kürzester i-j-Weg ein Pfad! Algorithmen für Graphen / Kürzeste Wege 108 Algorithmus von Floyd-Warshall kürzeste Wege zwischen je zwei Knoten Voraussetzung: jeder Kreis hat nichtnegatives Gewicht Floyd-Warshall(G = (V , A), w), w : A → R 0 : i=j 1 di,j (0) = w(vi , vj ) : (vi , vj ) ∈ A ∞ : sonst 2 Für k := 0 bis n − 1: 3 Für i := 1 bis n: Für j := 1 bis n: 4 di,j (k + 1) := min{di,j (k ), di,k +1 (k ) + dk +1,j (k )} 5 Bemerkung Laufzeit ist offensichtlich O(n3 ) Speicherplatz läßt sich auf Θ(n2 ) reduzieren, z.B. durch Speichern zweier n × n-Tabellen: di,j ((k + 1) mod 2) := min{di,j (k mod 2), di,k+1 (k mod 2) + dk+1,j (k mod 2))} Nach Ablauf gilt: es gibt ein negatives Diagonalelement gdw. es gibt einen Kreis negativer Länge. Theoretische Informatik 3 (SS 2007) Algorithmen für Graphen / Kürzeste Wege 109 Rekursion vs. Iteration Mehrfachberechnung bei Rekursion Erstellt man einen Rekursionsbaum, so hat jeder Knoten di,j (k) mit k > 0 drei Nachbarn. Für di,j (n) entsteht dann ein vollständig ternärer Baum der Tiefe n + 1. Dieser hat mehr als 3n Knoten, wobei die meisten Werte mehrfach berechnet werden. Ein ähnliches Phänomen ergibt sich bei der rekursiven Berechnung der Fibonacci-Zahlen. d(i,j) =: di,j (k+1) [k+1] Maximal innerer Knoten [k] + d(i,j) d(i,k+1) + [k−1] d(i,j) d(i,k) Theoretische Informatik 3 (SS 2007) d(k+1,j) + d(k,j) d(i,k+1) d(i,k) + d(k,k+1) d(k+1,j) d(k+1,k) Algorithmen für Graphen / Kürzeste Wege d(k,j) 110 Inhalt 1 Elementare Algorithmen 2 Algorithmen für Graphen Einführung Tiefen- und Breitensuche Minimal Spannende Bäume Kürzeste Wege Matchings 3 Mathematische Algorithmen Theoretische Informatik 3 (SS 2007) Algorithmen für Graphen / Matchings 111 Matchings/Paarungen Definition 25. Sei G = (V , E) ein Graph. M ⊆ E heißt Matching, falls keine zwei Kanten aus M einen Knoten gemeinsam haben. M heißt maximales Matching, falls M ∪ {e} für alle e ∈ E \ M kein Matching ist. Ein Matching M heißt größtes Matching, falls |M| ≥ |M 0 | für alle Matchings M 0 von G gilt. Die Kardinalität eines größten Matchings in G wird mit ν(G) bezeichnet. Ein Matching M heißt perfekt, falls 2|M| = |V | gilt. Ein Knoten v ∈ V heißt überdeckt bezüglich eines Matchings M, falls es eine Kante e ∈ M gibt, mit v ∈ e. Anwendungen: Zuordnungsprobleme Graphenpartitionierung Theoretische Informatik 3 (SS 2007) Algorithmen für Graphen / Matchings 112 Maximale Matchings A LGORITHMUS: GreedyMaxMatching(G) Eingabe: Gesucht: Graph G = (V , E) maximales Matching M ⊆ E 1 Setze M := ∅ und für alle v ∈ V : setze matched(v ) = f. 2 Solange es eine Kante {x, y } ∈ E gibt, so dass matched(x) = f und matched(y ) = f. 3 4 Setze matched(x) := matched(y) := t Setze M := M ∪ {x, y} . Beobachtung 26. Der Algorithmus GreedyMaxMatching(G) findet ein maximales Matching in O(|V | + |E|). Lemma 27. Sei M ein maximales Matching in G. Dann gilt: ν(g)/2 ≤ |M| ≤ ν(G). Beweis: Es sei V (M) ⊆ V die Menge der von M überdeckten Knoten. Dann gilt 2|M| = |V (M)|. Jede Kante eines größten Matchings M 0 von G muss mindestens einen Knoten aus V (M) enthalten, da ansonsten M nicht maximal wäre. Somit gilt ν(G) = |M 0 | ≤ |V (M)| = 2|M|. Theoretische Informatik 3 (SS 2007) Algorithmen für Graphen / Matchings 113 Augmentierende Pfade Definition 28. Ein Pfad in einem Graphen G = (V , E) heißt M-alternierend bezüglich eines Matchings M, falls er abwechselnd Kanten aus M und aus E \ M benutzt. Ein x-y -Pfad (x 6= y ) heißt M-augmentierend, falls er alternierend ist und x und y von M nicht überdeckt werden. Satz 29 (Berge ’57). Ein Matching M ist genau dann ein größtes Matching, wenn kein M-augmentierender Pfad existiert. Beweis: ⇒“ Falls es einen M-augmentierenden Pfad gibt, so ist M offensichtlich nicht ein größtes Matching, denn ” durch Vertauschen von Matchingkanten und nicht-Matchingkanten entlang des M-augmentierenden Pfades erhält man ein größeres Matching. ⇐“ Wir nehmen nun an, dass M kein größtes Matching ist. Sei M 0 Matching mit |M 0 | > |M|. Betrachte die ” symmetrische Differenz M4M 0 . Diese induziert einen Graphen mit Maximalgrad 2 und besteht somit aus der Vereinigung von geraden Kreisen und Pfaden. Wegen |M 0 | > |M| muss es dann einen M-augmentierenden Pfad geben. Bemerkung. Die meisten Matchingalgorithmen beruhen auf dem Satz von Berge und erweitern ein gegebenes Matching entlang augmentierende Pfade, bis es keine mehr gibt. Theoretische Informatik 3 (SS 2007) Algorithmen für Graphen / Matchings 114 Ungarische Wälder Definition 30. Sei G ein Graph mit Matching M. Ein Baum in G mit einem als Wurzel ausgezeichneten Knoten heißt alternierend, falls die Wurzel nicht von M überdeckt ist und alle von der Wurzel zu den Blättern gehenden Pfade alternierend sind und gerade Länge haben. Ein alternierender Wald ist die disjunkte Vereinigung alternierender Bäume. Für einen alternierenden Wald F bezeichnen die Mengen even(F ) bzw. odd(F ) alle Knoten, die geraden bzw. ungeraden Abstand von einer Wurzel haben. Bemerkung. Ein alternierender Baum mit Wurzel x enthält alle potenziellen Anfangsstücke von augmentierenden Pfaden, die in x beginnen. Wenn eine nicht-Matchingkante die Blätter zweier alternierender Bäume verbindet, dann erhält man einen augmentierenden Pfad von der einen Wurzel zur anderen. Falls es keine solche Kante gibt, dann spricht man von einem ungarischem Wald. Theoretische Informatik 3 (SS 2007) Algorithmen für Graphen / Matchings 115 Finden größter Matchings in bipartiten Graphen A LGORITHMUS: AugmentBipMatching(G, M) Eingabe: Gesucht: bipartiter Graph G = (V , E) und Matching M augmentierender Pfad, wenn es einen gibt 1 Setze F := von M nicht überdeckte Knoten 2 Setze even(F ) := F und odd(F ) = ∅. 3 Solange es eine Kante {x, y } ∈ E gibt, so dass x ∈ even(F ) und y 6∈ odd(F ). 4 5 Falls y 6∈ even(F ): // Dann ist y 6∈ F und es gibt {y , z} ∈ M 6 Erweitere F um {x, y } und {y , z} 7 Setze odd(F ) := odd(F ) ∪ {y } und even(F ) := even(F ) ∪ {z} 8 9 Sonst return augm. Pfad von der Wurzel des Baumes von x zur Wurzel von y . // Beachte die x und y müssen in verschiedenen Bäumen liegen, da beide geraden // Abstand zur entsprechenden Wurzel haben und G bipartit ist. 10 return F ist ein ungarischer Wald Theoretische Informatik 3 (SS 2007) Algorithmen für Graphen / Matchings 116 BipMatching(G) A LGORITHMUS: BipMatching(G) Eingabe: Gesucht: bipartiter Graph G = (V , E) größtes Matching M 1 Setze M := ∅. 2 Solange AugmentBipMatching(G, M) einen augm. Pfad zurückgibt Erweitere M entlang des augm. Pfades. 3 Satz 31. Der Algorithmus BipMatching bestimmt ein größtes Matching in einem bipartiten Graphen G = (V , E) und hat Laufzeit O(|V ||E|). Beweis: Zum Nachweis der Korrektheit reicht es offensichtlich zu zeigen, dass M größtes Matching ist, wenn die Prozedur AugmentBipMatching(G, M) einen ungarischen Wald F zurückliefert. Ist F ein ungarischer Wald, so sind gemäß der Bedingung in der while-Schleife die Knoten in even(F ) nur mit Knoten aus odd(F ) adjazent. Jedes Matching lässt somit mindestens | even(F )| − | odd(F )| viele Knoten in G unüberdeckt. Andererseits enthält jede Komponente des ungarischen Waldes F genau einen von M nicht überdeckten Knoten. Auf der Menge V \ (even(F ) ∪ odd(F )) bildet M ein perfektes Matching, da alle ungematchten Knoten in even(F ) liegen und es keine Matchingkante gibt, von der nur ein Endknoten im ungarischen Wald liegt. Die Anzahl Komponenten des ungarischen Waldes F ist | even(F )| − | odd(F )|, d.h. also M ist größtes Matching. Ohne Einschränkung können wir |V | = O(|E|) annehmen. Die Routine AugmentBipMatching(G, M) hat Laufzeit O(|V | + |E|) und wird maximal |V |/2-mal aufgerufen, womit sich die angegebene Gesamtlaufzeit ergibt. Theoretische Informatik 3 (SS 2007) Algorithmen für Graphen / Matchings 117 Matchingalgorithmen Der schnellste Algorithmus für das Finden eines größten Matchings in bipartiten Graphen ist von Hopcroft und Karp aus dem Jahr 1973 mit einer Laufzeit O(|V |1/2 |E|). Für das Matchingproblem auf allgemeinen Graphen hat Edmonds einen Algorithmus entwickelt. Dieser Algorithmus lässt sich mit einer Laufzeit O(|V |3 ) implementieren. 1980 wurde von Micali und Vazirani ein Algorithmus für das allgemeine Matchingproblem mit einer Laufzeit O(|V |1/2 |E|) vorgestellt. Eine vollständige Analyse erschien erst 1994. 1990 hat Blum einen eleganteren Algorithmus mit derselben Laufzeit entwickelt. Theoretische Informatik 3 (SS 2007) Algorithmen für Graphen / Matchings 118 Stabile Matchings Theoretische Informatik 3 (SS 2007) Algorithmen für Graphen / Matchings 119 Stabile Matchings/stable marriage problem Problem: stabiles Matching / stabile Ehe Gegeben: Gesucht: disjunkte Mengen X und Y mit |X | = |Y | und Gewichtsfunktionen/Präferenzen wx : Y → N für x ∈ X und wy : X → N für y ∈ Y Bijektion f : X → Y , so dass für kein Paar (x, y) ∈ X × Y gleichzeitig gilt: wx (y) > wx (f (x)) und wy (x) > wy (f −1 (y )). In anderen Worten: Gegeben: Ein vollständiger, bipartiter Graph Kn,n mit n = |X | = |Y | zusammen mit Präferenzlisten für jeden Knoten bezüglich der Knoten auf der anderen Seite. Gesucht: Ein perfektes stabiles Matching M, d.h. wenn {x1 , y2 } ∈ E(Kn,n ) \ M und {x1 , y1 }, {x2 , y2 } ∈ M, dann präferiert entweder x1 y1 mehr als y2 oder y2 präferiert x2 über x1 . D.h. nicht beide x1 und y2 mögen“ sich mehr als ihren jeweiligen ” Partner in M. Theoretische Informatik 3 (SS 2007) Algorithmen für Graphen / Matchings 120 Propose and Reject Gale & Shapley ’62 Seien die Knoten in der einen Klasse Männer“ und in der anderen Frauen“. ” ” 1 Solange es einen unverheirateten“ Mann x gibt: ” 2 x macht der Frau y einen Antrag“, die er noch nicht gefragt hat ” und die am höchsten auf seiner Präferenzliste steht. 3 y nimmt den Antrag an, wenn: • sie keinen Partner hat, • oder wenn x höher in ihrer Liste steht, als ihr jetziger Mann, welchen sie dann für x verlässt. Theoretische Informatik 3 (SS 2007) Algorithmen für Graphen / Matchings 121 Korrektheit des Gale-Shapley-Algorithmus’ Satz 32. Der Gale-Shapley-Algorithmus findet ein stabiles perfektes Matching und hat Laufzeit O(|X |2 ). Beweis: Perfektheit: Sobald eine Frau einmal verheiratet ist, bleibt sie verheiratet. Somit kann am Ende kein Mann x und keine Frau y unverheiratet sein, da x irgendwann y einen Antrag gemacht hätte und y diesen ersteinmal angenommen hätte. Stabilität: Seien x und y am Ende des Algorithmus zwar verheiratet, aber nicht miteinander. Angenommen x würde y seiner jetzigen Frau bevorzugen. Dann hätte er y einen Antrag gemacht bevor er seiner jetzigen Frau einen Antrag gemacht hätte. Dann hat y den Antrag von x entweder abgelehnt, da sie schon mit einem besseren Mann verheiratet ist, oder sie hat x später für einen besseren Mann verlassen und somit nur noch Anträge von noch besseren Männern angenommen. D.h. y präferiert ihren endgültigen Mann über x. Laufzeit: Jeder Mann macht höchstens |Y | = |X | Anträge und über einen Antrag wird in O(1) entschieden. Theoretische Informatik 3 (SS 2007) Algorithmen für Graphen / Matchings 122 Aktive Partnersuche zahlt sich aus“ ” Definition 33. Ein Paar (x, y ) ∈ X × Y heißt realisierbar, falls ein stabiles perfektes Matching M mit {x, y } ∈ M gibt. In dem Fall sagen wir auch, y ist für x realisierbar. Satz 34. Der Gale-Shaply-Algorithmus findet ein Mann-optimales Matching, d.h. jeder Mann x bekommt die Frau y mit der höchsten Präferenz unter allen realisierbaren Frauen. Beweis: Angenommen das gefundene Matching ist nicht Mann-optimal. Sei {x1 , y2 } das erste realisierbare Paar, welches abgelehnt wird. Entweder hat y2 den Antrag von x1 abgelehnt, da sie schon einen besseren Partner, sagen wir x2 , hatte oder ein besserer Partner x2 hat ihr später einen Antrag gemacht. Da {x1 , y2 } ein realisierbares Paar sind, gibt es ein perfektes, stabiles Matching M 0 in dem x1 mit y2 verheiratet ist. Sei y 0 der Partner von x2 in dieser Zuordnung M 0 . Es kann nicht sein, dass x2 die Frau y 0 mehr als y2 präferiert, da sonst x2 die Frau y 0 vor y2 gefragt hätte, und diese ihn irgendwann ablehnen/verlassen haben müsste, bevor x2 die Frau y2 fragt. Dies widerspricht der Annahme, dass {x1 , y2 } das erste realisierbare Paar ist, welches im Verlauf des Algorithmus nicht angenommen wurde. Also bevorzugt x2 die Frau y2 über y 0 und y2 bevorzugt x2 über x1 . Somit kann M 0 kein stabiles Matching sein. Korollar 35. Falls die Präferenzlisten von jedem Mann eine eindeutige Ordnung unter den Frauen definiert (d.h. wx (y ) 6= wx (y 0 ) für alle x ∈ X ), dann findet der Gale-Shapley-Algorithmus ein eindeutiges stabiles Matching unabhängig von der Reihenfolge der Anträge. Theoretische Informatik 3 (SS 2007) Algorithmen für Graphen / Matchings 123 Bemerkungen So ähnlich wie man Mann-Optimalität für den Gale-Shapley-Algorithmus zeigt, kann man zeigen, dass der Algorithmus Frau-pessimal ist, d.h. jede Frau bekommt den schlechtesten unter allen realisierbaren Partnern. Der Gale-Shapley-Algorithmus funktioniert auch, wenn es mehr Frauen als Männer gibt. In diesem Fall werden immer noch alle Männer optimal“ verheiratet ” und unabhängig von der Reihenfolge der Anträge bleiben bei eindeutigen Präferenzlisten immer dieselben Frauen unverheiratet. Falls es mehr Männer als Frauen gibt, dann werden alle Frauen pessimal“ ” verheiratet und unter den Männern gibt es eine Gruppe, die nie verheiratet wird. Mehr Informationen zum stable marriage problem gibt es in dem gleichnamigen Buch von Gusfield und Irving (MIT Press, 1989) Theoretische Informatik 3 (SS 2007) Algorithmen für Graphen / Matchings 124 Graphenalgorithmen: Zusammenfassung Darstellung von Graphen: Adjazenzmatrix, Adjazenzlisten Tiefensuche: Besuche rekursiv einen unbesuchten Nachbarn des aktuellen Knotens und gehe nur zurück, falls dies nicht mehr geht Laufzeit O(|V | + |E|) in Adjazenzlistendarstellung keine Querkanten bezüglich des Tiefensuchbaumes Breitensuche: Besuche alle unbesuchten Nachbarn des aktuellen Knotens und stelle diese“ hinten in der ” Warteschlange Q an. Fahre dann mit dem nächsten Knoten in Q fort, bis Q = ∅. Laufzeit O(|V | + |E|) in Adjazenzlistendarstellung Berechnet die Distanzen (in ungewichteten Graphen) zu dem Startknoten s der Breitensuche Es gibt keine Kanten {x, y } in G, die ein Level im Breitensuchbaum überspringen. Minimal spannende Bäume in gewichteten Graphen Greedy-Algorithmus von Kruskal: Füge die leichteste Kante zu T hinzu, die keinen Kreis schließt. Laufzeit: O((|E| + |V |) log |V |) kürzeste Pfade in gewichteten Graphen Dijkstra: Berechnet alle kürzesten Pfade von einem Startknoten, wenn alle Kantengewichte nicht-negativ sind, in O(|E| + |V | log |V |) mit Fibonacci-Heaps Floyd-Warshall: Berechnet kürzeste Pfade zwischen allen Knotenpaaren, wenn es keine Kreise mit negativem Gewicht gibt. Laufzeit: O(|V |3 ). Matchings maximale Matchings findet der Greedy-Algorithmus in O(|V | + |E|) größte Matchings in bipartiten Graphen: augmentierende Pfade, Ungarische Wälder einfache Implementation in O(|V ||E|), verbesserte Implementation von Hopcroft und Karp in O(|V |1/2 |E|) größte Matchings in allgemeinen Graphen: Edmonds mit Laufzeit O(|V |3 ) und Micali und Vazirani mit Laufzeit O(|V |1/2 |E|). Stabile Matchings und der Gale-Shapley-Algorithmus Theoretische Informatik 3 (SS 2007) Algorithmen für Graphen / Matchings 125