Dozent: Dr. Christoph Garbe Tutoren: Niels Buwen, Marcel Gutsche, Alexander König, Daniel Stoll, Timo Wiese 7 Übungsblatt Algorithmen und Datenstrukturen SS 2015 18.06.2015 Aufgabe 1: Topoligisches Sortieren (9 P.) Sei G ein gerichteter, zyklenfreier Graph (“directed acyclig graph”, DAG). Als topologische Sortierung bezeichnet man die lineare Anordnung aller Knoten V (G), so dass ein Knoten u vor dem Knoten v angeordnet wird, wenn es in G eine Kante (u, v) ∈ E(G) gibt (Gäbe es Zyklen, wäre eine solche Anordnung nicht definiert). Bei einer solchen Anordnung zeigen alle Kanten aus E(G) von links nach rechts. Eltern möchten für ihre Kinder einen bunten Kuchen backen. Die Abhängigkeiten, in der die Zutaten zum Teig zugegeben werden müssen, sind in Abb. 1 angegeben (z.B. Butter vor Eiern). Um die richtige Reihenfolge der Zutaten zu erhalten, sortieren sie den Abhängigkeitsgraphen topologisch. a) Geben Sie die lineare Anordnung an, die sich durch topologisches Sortieren ergibt. In welcher Reihenfolge muss der Kuchen angerührt werden? (3 P.) b) Ist diese Reihenfolge eindeutig? Begründen Sie Ihre Antwort! (2 P.) c) Geben Sie einen einfachen Algorithmus zum topologischen Sortieren an, der auf der Tiefensuche basiert. (4 P.) 1 Zucker Butter Salz Farbstoff Eier Mehl Backpulver Milch Abbildung 1: Abhängigkeiten der Zutaten beim Backen 2 Aufgabe 2: Strongly-Connected-Components (6 P.) Ein Teilgraph ist stark zusammenhängend (“strongly connected”), wenn jeder Knoten von jedem anderen erreichbar ist. Stark zusammenhängende Komponenten (“Strongly-ConnectedComponents”) eines gerichteten Graphen bilden demnach eine Partitionierung in Untergraphen, die ihrerseits stark zusammenhängend sind. Weitere Informationen finden Sie unter https://en.wikipedia.org/wiki/Strongly_connected_component. a) Identifizieren Sie in dem gegebenen Graphen die “Strongly-Connected-Components”.(2 P.) b) Wie ändert sich die Zahl der stark zusammenhängenden Teilgraphen eines Graphen G, wenn eine neue Kante hinzugefügt wird? (2 P.) c) Zeigen Sie anhand des gegebenen Graphen wie ein Verfahren Strongly − Connected − Components funktionieren könnte. Hinweis: Die Tiefensuche darf mehrmals angewendet werden. Man spricht von einem “transponierten Graph” GT , wenn man in einem gerichteten Graph die Richtungen aller Kanten umkehrt. (4 P.) Graph G 3 Aufgabe 3: Tiefensuche (5 P.) a) Führen Sie mit dem gegebenen Graphen T eine Tiefensuche durch. Begründen Sie ihre Schritte kurz. (grauerKnoten = Startpunkt) (3 P.) Graph T b) Klassifizieren Sie die Kanten in a) Baumkanten b) Vorwärtskanten c) Rückwärtskanten d) Querkanten (2 P.) Aufgabe 4: Tiefensuche in Python (10 P.) Importieren Sie das Projekt aus AlgoDat07.zip. Im Projekt finden Sie die Datei dfs.py. In dieser Datei ist die Klasse Graph, welche den Graphen aus Graph T repräsentieren soll. Der Graph soll in einer Adjezenzliste abgespeichert werden. a) Überlegen Sie sich, wie Sie die Adjezenzliste vervollständigen können. Zusätzlich soll die Klasse später den Beginn d und das Ende f der Bearbeitungszeit jedes Knoten enthalten. (2 P.) b) Vervollständigen Sie nun den Code der Funktion DFS(graph,name), so dass bei Ihrem Aufruf eine Tiefensuche auf dem gespeicherten Graphen durchgeführt wird. Beginnen soll Ihre Funktion bei dem als Argument übergebenen Knoten und mit Hilfe von DFSvisit(next), wobei das Argument next den nächsten zu bearbeitenden Knoten festlegt. Speichern Sie die Bearbeitungszeit aller Knoten in geeigneter Weise ab. (8 P.) 4