Rolf Wanka Philipp Schneider Erlangen, 22. Oktober 2009 Übungen zur Vorlesung Effiziente kombinatorische Algorithmen WS 2009/2010 Blatt 1 AUFGABE 1: Gegeben sei folgender Graph G1 : v1 (b) Wenden Sie den aus der Vorlesung bekannten Tiefensuchalgorithmus für ungerichtete Graphen auf den Graphen G1 an. (i) Verwenden Sie v1 als Startknoten. v3 v2 (a) Stellen Sie die Inzidenzlisten für die einzelnen Knoten auf. Die Reihenfolge ist durch die Knotennummerierung gegeben: Sind zwei Knoten vi und v j Elemente derselben Liste, so erscheint vi vor v j genau dann, wenn i < j. v5 v4 v6 v9 v7 v8 (ii) Verwenden Sie v6 als Startknoten. AUFGABE 2: Im Buch Der Name der Rose“ haben sich der Franziskaner-Mönch William von Baskerville und der Bene” diktiner-Mönch Adson von Melk im Labyrinth der Kloster-Bibliothek verlaufen. Nun überlegen sie, wie sie die Bibliothek wieder verlassen können. Es kommt zu folgendem Dialog. Um den Ausgang aus einem Labyrinth zu finden, dozierte William, gibt es nur ein Mittel. An jedem neuen, das heißt noch niemals zuvor erreichten Kreuzungspunkt wird der Durchgang, durch den man gekommen ist, mit drei Zeichen markiert. Erkennt man an den bereits vorhandenen Zeichen auf einem der Durchgänge, daß man an der betreffenden Kreuzung schon einmal gewesen ist, bringt man an dem Durchgang, durch den man gekommen ist, nur ein Zeichen an. Sind alle Durchgänge schon mit Zeichen versehen, so muß man umkehren und zurückgehen. Sind aber einer oder zwei Durchgänge der Kreuzung noch nicht mit Zeichen versehen, so wählt man einen davon und bringt zwei Zeichen an. Durchschreitet man einen Durchgang, der nur ein Zeichen trägt, so markiert man ihn mit zwei weiteren, so daß er nun drei Zeichen trägt. Alle Teile eines Labyrinths müßten durchlaufen sein, wenn man, sobald man an eine Kreuzung gelangt, niemals den Durchgang mit drei Zeichen nimmt, sofern noch einer der anderen Durchgänge frei von Zeichen ist. Woher wißt Ihr das? Seid Ihr Experte in Labyrinthen? Nein, ich rezitiere nur einen alten Text, den ich einmal gelesen habe. Und nach dieser Regel gelangt man hinaus? Nicht daß ich wüßte. [. . .] (Aus: Umberto Eco, Der Name der Rose, dtv, München, 15 1991, S. 233) Helfen Sie Bruder William, indem Sie das Verfahren analysieren. Arbeitet es korrekt? AUFGABE 3: (a) Geben Sie einen Algorithmus in Pseudocode an, der einen durch seine Inzidenzlisten gegebenen Graphen G = (V, E) folgendermaßen traversiert (Breitensuche) und dabei die Menge der benötigten Kanten T und die Besuchsreihenfolge der Knoten bfnr als Array mit Einträgen aus 1 . . . |V | ausgibt: – Beginne bei einem beliebigen Knoten r ∈ V . – Besuche zunächst alle Nachbarn von r, besuche dann die Nachbarn der Nachbarn (falls sie noch nicht besucht wurden), usw. Hinweis: Nutzen Sie dabei aus, dass Sie Knoten mit BESUCHT / NICHT BESUCHT-Flags versehen können. (b) Wenden Sie Ihren Algorithmus auf den Graphen aus Aufgabe 1 an. i) Verwenden Sie v1 als Startknoten. ii) Verwenden Sie v6 als Startknoten. AUFGABE 4: Gegeben ist ein Digraph G = (V, E) mit der Knotenmenge V = {v1 , . . . , vn }. Jedem Knoten vi ist eine natürliche Zahl mi zugeordnet. Die Knoten v1 , . . . , vn heißen topologisch sortiert genau dann, wenn für jede Kante e = (vi , v j ) ∈ E gilt: mi < m j . Beispiel: 1 v1 v2 2 3 v3 6 v4 v6 4 v5 5 7 v7 v8 8 v9 9 Bemerkung: Ein Digraph kann mehrere topologische Sortierungen haben. (a) Finden Sie ein Gegenbeispiel, warum die Ausgabe dfnr des in der Vorlesung besprochenen Tiefensuchalgorithmus in der Regel keine topologische Sortierung definiert. (b) Finden Sie ein Gegenbeispiel, warum die Ausgabe bfnr ihres Breitensuchalgorithmus aus Aufgabe 3 in der Regel keine topologische Sortierung definiert. (c) Geben Sie informell einen Algorithmus an, um eine topologische Sortierung zu berechnen, und wenden Sie Ihren Algorithmus auf obigen Graphen an. (d) Ermitteln Sie die Laufzeit Ihres Algorithmus.