Blatt 07

Werbung
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
Herunterladen