TU Ilmenau, Fakultät für Informatik und Automatisierung FG Komplexitätstheorie und Effiziente Algorithmen Univ.-Prof. Dr. M. Dietzfelbinger, Dr. C. Mattern, M.Sc. Stefan Walzer http://www.tu-ilmenau.de/iti/lehre/lehre-ss-2016/aud/ Algorithmen und Datenstrukturen SS 2016 – Übung 12 Besprechung: 25. Kalenderwoche (27. Juni - 1. Juli 2016) Aufgabe 1 (Ablauf des Dijkstra-Algorithmus) Führen Sie den Algorithmus von Dijkstra an folgendem Eingabegraphen startend vom Knoten S aus. Zeichnen Sie exemplarisch zu selbst gewählten Zeitpunkten ein mögliches Aussehen des Binärheaps. Wie viele insert-, extractMin-, bzw. decreaseKey-Operationen werden auf diesem Beispiel ausgeführt? Beschriften Sie die Knoten wie folgt: Wenn Knoten v in Runde i vom Algorithmus bearbeitet wird, dann tragen Sie . .i . v “ an der markierten Stelle ein. Wenn der dist-Wert eines Knotens v in Runde i ” verändert wird, tragen Sie in die dem Knoten zugehörige Tabelle eine neue Spalte für Runde i mit Runde ” i“, dem neuen dist-Wert“, und dem neuen Vorgänger ( pred“) des Knotens ein. (Ein Beispiel für das ” ” mögliche Aussehen dieser Tabelle sehen Sie rechts unten.) Runde dist pred 0 0 – Runde dist pred S .... 0 ∞ – A 1 .... 4 6 Runde dist pred 5 .... 2 Runde dist pred D 0 ∞ – 1 .... B Runde dist pred 0 ∞ – 0 ∞ – E 1 .... 3 C .... 1 Runde dist pred 0 ∞ – Aufgabe 2 (Bidirektionaler Dijkstra-Algorithmus) Beispiel: Knoten U wird in Runde 25 bearbeitet. . .25 ... U Runde dist pred 0 ∞ – 2 24 X 5 12 Y 11 10 Z In dieser Aufgabe betrachten wir das folgende Problem: Gegeben sei ein gerichteter Graph G = (V, E, c) mit nichtnegativen Kantengewichten und zwei ausgezeichnete Knoten s,t ∈ V . Wir nehmen an, dass in dem Graphen mindestens ein (s,t)-Weg (also ein einfacher Weg von s nach t) existiert. Wir suchen in G einen kürzesten Weg von s nach t. Dieses Problem können wir mit dem Algorithmus von Dijkstra lösen. Dabei brechen wir den Algorithmus ab, wenn der Knoten t abgearbeitet – also in die Menge S aufgenommen – wird. 2 Algorithmen und Datenstrukturen SS 2016 – Übung 12 Wir betrachten die folgende Variation: Der Algorithmus wird sowohl vom Start- als auch vom Zielknoten gleichzeitig gestartet mit zwei Prioritätswarteschlangen PQ1 bzw. PQ2 und zwei dist-Arrays dist1 bzw. dist2 . Der zweite Dijkstra-Ablauf findet dabei im Umkehrgraphen statt. In jeder Runde wird genau ein Knoten bearbeitet – entweder aus PQ1 oder PQ2 –, nämlich derjenige Knoten mit insgesamt kleinster Priorität. Für diesen Knoten wird nun eine komplette Runde im Dijkstra-Algorithmus ausgeführt. Der eigentliche Algorithmus-Ablauf stoppt, falls man einen Knoten gefunden hat, der von beiden DijkstraAbläufen abgearbeitet worden ist. Sei v∗ ein solcher Knoten. (a) Geben Sie ein Beispiel an, in dem ein kürzester (s,t)-Weg nicht über v∗ läuft. In einem Nachverarbeitungsschritt macht man nun noch Folgendes: Man entnimmt jeden Knoten aus PQ1 . Falls dieser Knoten von der zweiten Instanz bearbeitet worden ist, so betrachtet man, ob über diesen Knoten ein kürzerer Weg von s nach t führt. Wenn ja, ist dieser Weg der aktuell kürzeste Weg von s nach t; ansonsten ignoriert man ihn. (b) Beweisen Sie, dass diese Variante einen kürzesten (s,t)-Weg findet. Hinweis: Sei p ein (beliebiger) kürzester (s,t)-Weg. Betrachten Sie den Zeitpunkt, an dem der Knoten v∗ gefunden wird. Unterscheiden Sie die folgenden drei Fälle: (i) v∗ liegt auf p. (ii) p nutzt nur Knoten, die jeweils von einer der beiden Dijkstra-Abläufe abgearbeitet wurde. (iii) p enthält einen Knoten, der von keinem der beiden Algorithmen betrachtet worden ist.