Algorithmen und Datenstrukturen 2 - 2. Seminar Dominic Rose Bioinformatics Group, University of Leipzig Sommersemster 2010 Outline 2. Übungsserie: 3 Aufgaben, insgesamt 30 Punkte A4 Flußnetzwerk, Restgraphen (9 Punkte) A5 Dijkstra, Bellman-Ford Algorithmus (10 Punkte) A6 Tarjan Algorithmus (11 Punkte) Wiederholung: Flußnetzwerke Anwendungsprobleme: • Wieviel Autos können durch ein Straßennetz fahren? • Wieviel Abwasser fasst ein Kanalnetz? • Wieviel Strom kann durch ein Leitungsnetz fließen? Definition: • Ein (Fluß-)Netzwerk ist ein gerichteter Graph G = (V , E , c) mit ausgezeichneten Knoten q (Quelle) und s (Senke), sowie einer Kapazitätsfunktion c : E → Z +. Wiederholung: Flußnetzwerke • Fluß: f : E → Z , so dass gilt: • Kapazitätsbeschränkung: ∀e ∈ E : f (e) ≤ c(e). (Kapazität wird für keine Kante überschritten) • Flußerhaltung: P P ∀v ∈ V \ {q, s} : f ((v 0 , v )) = f ((v , v 0 )) (v 0 ,v )∈E (v ,v 0 )∈E (was in Knoten hinein fließt, fließt auch wieder heraus) • Der Wert von f , w (f ), ist die Summe der Flußwerte der P die Quelle q verlassenden Kanten: f ((q, v )) (q,v )∈E Wiederholung: Flußnetzwerke • Gesucht: Fluß mit maximalen Wert • begrenzt durch Kapazitäten von Quelle, Senke • Engpässe, minimaler Schnitt vs. maximaler Fluss Wiederholung: Flußnetzwerke Kapazität: 10 + 5 + 10 = 35 Wiederholung: Flußnetzwerke Kapazität: 9 + 15 + 8 + 30 = 62 Wiederholung: Flußnetzwerke Kapazität: 10 + 8 + 10 = 28 !!! Wiederholung: Flußnetzwerke Optimierung des Flußes in G: • entlang “zunehmender Wege” w . • um min(rest(e)) mit e liegt auf w Zunehmender Weg: • Gerichteter Pfad von Quelle zur Senke im Restgraphen. • Eben Pfad mit verfügbarer Restkapazität Wiederholung: Flußnetzwerke Graph: Kapazität / Fluss Restgraph Wiederholung: Flußnetzwerke Ford-Fulkerson-Algorithmus: • sucht sukzessiv nach flussvergrößernden Wegen im Restgraphen • fügt solange wie möglich zunehmende Wege zum Gesamtfluß hinzu • Gesamtfluß erhöht sich um Minimum der Restkapazität der Kanten des jeweiligen zunehmenden Wegs Aufgabe 4 Ein Flussnetzwerk mit der Knotenmenge {q, a, b, c, d, s} habe genau die folgenden Kanten. (q, a, 9, ?), (q, c, 4, ?), (c, d, 6, 5), (a, b, 8, ?), (b, c, 6, 3), (b, d, 7, 4), (b, s, 3, 1), (d, s, 11, ?) Hierbei bedeutet ein 4-Tupel (v , w , κ, φ), dass die Kante (v , w ) eine Kapazität κ besitzt, von der derzeit φ genutzt wird. Aufgabe 4 a) Errechnen Sie die fehlenden (durch ? ersetzten) φ-Werte, so dass sich ein gültiger Fluss ergibt. Zeichnen Sie das gegebene Flussnetzwerk und schreiben Sie an jede Kante die Werte φ, κ. (3 Punkte) Aufgabe 4 a) Errechnen Sie die fehlenden (durch ? ersetzten) φ-Werte, so dass sich ein gültiger Fluss ergibt. Zeichnen Sie das gegebene Flussnetzwerk und schreiben Sie an jede Kante die Werte φ, κ. (3 Punkte) (q, a, 9, ?), (q, c, 4, ?), (c, d, 6, 5), (a, b, 8, ?), (b, c, 6, 3), (b, d, 7, 4), (b, s, 3, 1), (d, s, 11, ?) Aufgabe 4 a) Errechnen Sie die fehlenden (durch ? ersetzten) φ-Werte, so dass sich ein gültiger Fluss ergibt. Zeichnen Sie das gegebene Flussnetzwerk und schreiben Sie an jede Kante die Werte φ, κ. (3 Punkte) (q, a, 9, ?), (q, c, 4, ?), (c, d, 6, 5), (a, b, 8, ?), (b, c, 6, 3), (b, d, 7, 4), (b, s, 3, 1), (d, s, 11, ?) (q, a, 9, 8), (q, c, 4, 2), (c, d, 6, 5), (a, b, 8, 8), (b, c, 6, 3), (b, d, 7, 4), (b, s, 3, 1), (d, s, 11, 9) Aufgabe 4 b) Zeichnen Sie den Restgraphen des Flussnetzwerks. (3 Punkte) Aufgabe 4 b) Zeichnen Sie den Restgraphen des Flussnetzwerks. (3 Punkte) Aufgabe 4 c) Geben Sie alle zunehmenden Wege und das jeweilige Minimum der verfügbaren Restkapazität an. (3 Punkte) Aufgabe 4 c) Geben Sie alle zunehmenden Wege und das jeweilige Minimum der verfügbaren Restkapazität an. (3 Punkte) Aufgabe 5 Gegeben sei der gewichtete gerichtete Graph G = (V , E , w ). a) Benutzen Sie den Dijkstra-Algorithmus, um die Längen der kürzesten Pfade von Knoten 1 zu allen anderen Knoten zu berechnen. Geben Sie nach jeder Extraktion eines Knotens aus der Queue und nach Abschluss der Berechnung für alle Knoten i ∈ {1 . . . 6} den aktuellen Wert D[i] an. (5 Punkte) Wiederholung: Dijkstra Kürzeste Wege zw. 2 Knoten: • Verallgemeinerung der Breitensuche. • Ausgehend vom Startknoten wird sukzessive der nächst beste Knoten in eine Ergebnismenge aufgenommen und aus der Menge der noch zu bearbeitenden Knoten entfernt. • Gehört zur Klasse der Greedy-Algorithmen. • Erfordert nicht-negative Gewichte. Wiederholung: Dijkstra Gesucht: Kürzester Weg von 1 zur 4. Wiederholung: Dijkstra Gesucht: Kürzester Weg von 1 zur 4. Wiederholung: Dijkstra Gesucht: Kürzester Weg von 1 zur 4. Wiederholung: Dijkstra Gesucht: Kürzester Weg von 1 zur 4. Wiederholung: Dijkstra Gesucht: Kürzester Weg von 1 zur 4. Wiederholung: Dijkstra Gesucht: Kürzester Weg von 1 zur 4. Wiederholung: Dijkstra Gesucht: Kürzester Weg von 1 zur 4. Aufgabe 5 D(1, 1) 0 D(1, 2) ∞ D(1, 3) ∞ D(1, 4) ∞ D(1, 5) ∞ D(1, 6) ∞ v 1 Q 2,3,4,5,6 Aufgabe 5 D(1, 1) 0 0 D(1, 2) ∞ 2 (0+2) D(1, 3) ∞ 7 (0+7) D(1, 4) ∞ ∞ D(1, 5) ∞ ∞ D(1, 6) ∞ ∞ v 1 2 Q 2,3,4,5,6 3,4,5,6 Aufgabe 5 D(1, 1) 0 0 0 D(1, 2) ∞ 2 (0+2) 2 D(1, 3) ∞ 7 (0+7) 3 (2+1) D(1, 4) ∞ ∞ 8 (2+6) D(1, 5) ∞ ∞ ∞ D(1, 6) ∞ ∞ ∞ v 1 2 3 Q 2,3,4,5,6 3,4,5,6 4,5,6 Aufgabe 5 D(1, 1) 0 0 0 0 D(1, 2) ∞ 2 (0+2) 2 2 D(1, 3) ∞ 7 (0+7) 3 (2+1) 3 D(1, 4) ∞ ∞ 8 (2+6) 8 D(1, 5) ∞ ∞ ∞ 4 (3+1) D(1, 6) ∞ ∞ ∞ ∞ v 1 2 3 5 Q 2,3,4,5,6 3,4,5,6 4,5,6 4,6 Aufgabe 5 D(1, 1) 0 0 0 0 0 D(1, 2) ∞ 2 (0+2) 2 2 2 D(1, 3) ∞ 7 (0+7) 3 (2+1) 3 3 D(1, 4) ∞ ∞ 8 (2+6) 8 7 (4+3) D(1, 5) ∞ ∞ ∞ 4 (3+1) 4 D(1, 6) ∞ ∞ ∞ ∞ 5 (4+1) v 1 2 3 5 6 Q 2,3,4,5,6 3,4,5,6 4,5,6 4,6 4 Aufgabe 5 D(1, 1) 0 0 0 0 0 0 D(1, 2) ∞ 2 (0+2) 2 2 2 2 D(1, 3) ∞ 7 (0+7) 3 (2+1) 3 3 3 D(1, 4) ∞ ∞ 8 (2+6) 8 7 (4+3) 6 (5+1) D(1, 5) ∞ ∞ ∞ 4 (3+1) 4 4 D(1, 6) ∞ ∞ ∞ ∞ 5 (4+1) 5 v 1 2 3 5 6 4 Q 2,3,4,5,6 3,4,5,6 4,5,6 4,6 4 Aufgabe 5 D(1, 1) 0 0 0 0 0 0 0 D(1, 2) ∞ 2 (0+2) 2 2 2 2 2 D(1, 3) ∞ 7 (0+7) 3 (2+1) 3 3 3 3 D(1, 4) ∞ ∞ 8 (2+6) 8 7 (4+3) 6 (5+1) 6 D(1, 5) ∞ ∞ ∞ 4 (3+1) 4 4 4 D(1, 6) ∞ ∞ ∞ ∞ 5 (4+1) 5 5 v 1 2 3 5 6 4 Q 2,3,4,5,6 3,4,5,6 4,5,6 4,6 4 Aufgabe 5 Gegeben sei der gewichtete gerichtete Graph G = (V , E , w ). b) Der Graph H entstehe aus G durch Hinzunahme der Kante e = (3, 6) mit dem Gewicht w (e) = −4. Benutzen Sie den Bellman-Ford-Algorithmus, um im Graphen H die Längen der kürzesten Pfade von Knoten 1 zu allen anderen zu berechnen. (5 Punkte) Wiederholung: Bellman-Ford Output: Graph mit “Knotendistanzen”, die jeweils min. Distanz vom Startknoten angeben. Wiederholung: Bellman-Ford Wiederholung: Bellman-Ford Wiederholung: Bellman-Ford Wiederholung: Bellman-Ford Wiederholung: Bellman-Ford Wiederholung: Bellman-Ford Wiederholung: Bellman-Ford Wiederholung: Bellman-Ford Wiederholung: Bellman-Ford Wiederholung: Bellman-Ford Wiederholung: Bellman-Ford Wiederholung: Bellman-Ford Wiederholung: Bellman-Ford Wiederholung: Bellman-Ford Wiederholung: Bellman-Ford Wiederholung: Bellman-Ford Wiederholung: Bellman-Ford Wiederholung: Bellman-Ford Wiederholung: Bellman-Ford Wiederholung: Bellman-Ford Wiederholung: Bellman-Ford Wiederholung: Bellman-Ford Wiederholung: Bellman-Ford Wiederholung: Bellman-Ford Wiederholung: Bellman-Ford Aufgabe 5 Gegeben sei der gewichtete gerichtete Graph G = (V , E , w ). b) Der Graph H entstehe aus G durch Hinzunahme der Kante e = (3, 6) mit dem Gewicht w (e) = −4. Benutzen Sie den Bellman-Ford-Algorithmus, um im Graphen H die Längen der kürzesten Pfade von Knoten 1 zu allen anderen zu berechnen. (5 Punkte) Aufgabe 5 Ausgabe Kante Start: D[1] = 0; D[i] = ∞ für i = 2, ..., 6 D(1, 1) D(1, 2) D(1, 3) D(1, 4) 0 ∞ ∞ ∞ D(1, 5) ∞ D(1, 6) ∞ Aufgabe 5 Ausgabe Kante (1,2,2) Start: D[1] = 0; D[i] = ∞ für i = 2, ..., 6 D(1, 1) D(1, 2) D(1, 3) D(1, 4) 0 ∞ ∞ ∞ 0 2 (0+2) ∞ ∞ D(1, 5) ∞ ∞ D(1, 6) ∞ ∞ Aufgabe 5 Ausgabe Kante (1,2,2) (1,3,7) Start: D[1] = 0; D[i] = ∞ für i = 2, ..., 6 D(1, 1) D(1, 2) D(1, 3) D(1, 4) 0 ∞ ∞ ∞ 0 2 (0+2) ∞ ∞ 0 2 7 (0+7) ∞ D(1, 5) ∞ ∞ ∞ D(1, 6) ∞ ∞ ∞ Aufgabe 5 Ausgabe Kante (1,2,2) (1,3,7) (2,3,1) Start: D[1] = 0; D[i] = ∞ für i = 2, ..., 6 D(1, 1) D(1, 2) D(1, 3) D(1, 4) 0 ∞ ∞ ∞ 0 2 (0+2) ∞ ∞ 0 2 7 (0+7) ∞ 0 2 3 (2+1) ∞ D(1, 5) ∞ ∞ ∞ ∞ D(1, 6) ∞ ∞ ∞ ∞ Aufgabe 5 Ausgabe Kante (1,2,2) (1,3,7) (2,3,1) (2,4,6) Start: D[1] = 0; D[i] = ∞ für i = 2, ..., 6 D(1, 1) D(1, 2) D(1, 3) D(1, 4) 0 ∞ ∞ ∞ 0 2 (0+2) ∞ ∞ 0 2 7 (0+7) ∞ 0 2 3 (2+1) ∞ 0 2 3 8 (2+6) D(1, 5) ∞ ∞ ∞ ∞ ∞ D(1, 6) ∞ ∞ ∞ ∞ ∞ Aufgabe 5 Ausgabe Kante (1,2,2) (1,3,7) (2,3,1) (2,4,6) (3,5,1) Start: D[1] = 0; D[i] = ∞ für i = 2, ..., 6 D(1, 1) D(1, 2) D(1, 3) D(1, 4) 0 ∞ ∞ ∞ 0 2 (0+2) ∞ ∞ 0 2 7 (0+7) ∞ 0 2 3 (2+1) ∞ 0 2 3 8 (2+6) 0 2 3 8 D(1, 5) ∞ ∞ ∞ ∞ ∞ 4 (3+1) D(1, 6) ∞ ∞ ∞ ∞ ∞ ∞ Aufgabe 5 Ausgabe Kante (1,2,2) (1,3,7) (2,3,1) (2,4,6) (3,5,1) (3,6,-4) Start: D[1] = 0; D[i] = ∞ für i = 2, ..., 6 D(1, 1) D(1, 2) D(1, 3) D(1, 4) 0 ∞ ∞ ∞ 0 2 (0+2) ∞ ∞ 0 2 7 (0+7) ∞ 0 2 3 (2+1) ∞ 0 2 3 8 (2+6) 0 2 3 8 0 2 3 8 D(1, 5) ∞ ∞ ∞ ∞ ∞ 4 (3+1) 4 D(1, 6) ∞ ∞ ∞ ∞ ∞ ∞ -1 (3-4) Aufgabe 5 Ausgabe Kante (1,2,2) (1,3,7) (2,3,1) (2,4,6) (3,5,1) (3,6,-4) (5,4,3) Start: D[1] = 0; D[i] = ∞ für i = 2, ..., 6 D(1, 1) D(1, 2) D(1, 3) D(1, 4) 0 ∞ ∞ ∞ 0 2 (0+2) ∞ ∞ 0 2 7 (0+7) ∞ 0 2 3 (2+1) ∞ 0 2 3 8 (2+6) 0 2 3 8 0 2 3 8 0 2 3 7 (4+3) D(1, 5) ∞ ∞ ∞ ∞ ∞ 4 (3+1) 4 4 D(1, 6) ∞ ∞ ∞ ∞ ∞ ∞ -1 (3-4) -1 Aufgabe 5 Ausgabe Kante (1,2,2) (1,3,7) (2,3,1) (2,4,6) (3,5,1) (3,6,-4) (5,4,3) (5,6,1) Start: D[1] = 0; D[i] = ∞ für i = 2, ..., 6 D(1, 1) D(1, 2) D(1, 3) D(1, 4) 0 ∞ ∞ ∞ 0 2 (0+2) ∞ ∞ 0 2 7 (0+7) ∞ 0 2 3 (2+1) ∞ 0 2 3 8 (2+6) 0 2 3 8 0 2 3 8 0 2 3 7 (4+3) 0 2 3 7 D(1, 5) ∞ ∞ ∞ ∞ ∞ 4 (3+1) 4 4 4 D(1, 6) ∞ ∞ ∞ ∞ ∞ ∞ -1 (3-4) -1 -1 Aufgabe 5 Ausgabe Kante (1,2,2) (1,3,7) (2,3,1) (2,4,6) (3,5,1) (3,6,-4) (5,4,3) (5,6,1) (6,1,5) Start: D[1] = 0; D[i] = ∞ für i = 2, ..., 6 D(1, 1) D(1, 2) D(1, 3) D(1, 4) 0 ∞ ∞ ∞ 0 2 (0+2) ∞ ∞ 0 2 7 (0+7) ∞ 0 2 3 (2+1) ∞ 0 2 3 8 (2+6) 0 2 3 8 0 2 3 8 0 2 3 7 (4+3) 0 2 3 7 0 2 3 7 D(1, 5) ∞ ∞ ∞ ∞ ∞ 4 (3+1) 4 4 4 4 D(1, 6) ∞ ∞ ∞ ∞ ∞ ∞ -1 (3-4) -1 -1 -1 Aufgabe 5 Ausgabe Kante (1,2,2) (1,3,7) (2,3,1) (2,4,6) (3,5,1) (3,6,-4) (5,4,3) (5,6,1) (6,1,5) (6,4,1) Start: D[1] = 0; D[i] = ∞ für i = 2, ..., 6 D(1, 1) D(1, 2) D(1, 3) D(1, 4) 0 ∞ ∞ ∞ 0 2 (0+2) ∞ ∞ 0 2 7 (0+7) ∞ 0 2 3 (2+1) ∞ 0 2 3 8 (2+6) 0 2 3 8 0 2 3 8 0 2 3 7 (4+3) 0 2 3 7 0 2 3 7 0 2 3 0 (-1+1) D(1, 5) ∞ ∞ ∞ ∞ ∞ 4 (3+1) 4 4 4 4 4 D(1, 6) ∞ ∞ ∞ ∞ ∞ ∞ -1 (3-4) -1 -1 -1 -1 Aufgabe 5 Ausgabe Kante (1,2,2) (1,3,7) (2,3,1) (2,4,6) (3,5,1) (3,6,-4) (5,4,3) (5,6,1) (6,1,5) (6,4,1) 1. 2. 3. 4. 5. Start: D[1] = 0; D[i] = ∞ für i = 2, ..., 6 D(1, 1) D(1, 2) D(1, 3) D(1, 4) 0 ∞ ∞ ∞ 0 2 (0+2) ∞ ∞ 0 2 7 (0+7) ∞ 0 2 3 (2+1) ∞ 0 2 3 8 (2+6) 0 2 3 8 0 2 3 8 0 2 3 7 (4+3) 0 2 3 7 0 2 3 7 0 2 3 0 (-1+1) 0 2 3 0 0 2 3 0 0 2 3 0 0 2 3 0 0 2 3 0 D(1, 5) ∞ ∞ ∞ ∞ ∞ 4 (3+1) 4 4 4 4 4 4 4 4 4 4 D(1, 6) ∞ ∞ ∞ ∞ ∞ ∞ -1 (3-4) -1 -1 -1 -1 -1 -1 -1 -1 -1 Aufgabe 6 Geg: Gerichteter Graph, Kantenliste: 7, 10, 1, 2, 2, 3, 3, 4, 4, 2, 1, 5, 5, 4, 4, 6, 6, 7, 7, 6, 5, 7 a) Benutzen Sie den Tarjan-Algorithmus beginnend beim Knoten 1, um die starken Zusammenhangskomponenten von G zu berechnen. In der Schleife innerhalb von Tarjan-visit werden die Kindsknoten u des aktuellen Knotens v in aufsteigender Reihenfolge der Indizes bearbeitet. Geben Sie jeweils nach Beendigung dieser Schleife v, in[v] und l[v] an, sowie ggf. die vom Programm erzeugte Ausgabe einer starken Zusammenhangskomponente. (5 Punkte) Wiederholung: SZK Starke Zusammenhangskomponente = SZK • Ein gerichteter Graph G = (V , E ) heißt stark zusammenhängend, wenn für alle u, v ∈ V gilt: Es gibt einen Pfad von u nach v . • Eine starke Zusammenhangskomponente von G ist ein maximaler stark zusammenhängender Teilgraph von G . • Komponentengraph: Fasse alle Knoten einer ZSK zusammen. Wiederholung: SZK Graph Komponentengraph Aufgabe 6 Geg: Gerichteter Graph, Kantenliste: 7, 10, 1, 2, 2, 3, 3, 4, 4, 2, 1, 5, 5, 4, 4, 6, 6, 7, 7, 6, 5, 7 b) Zeichnen Sie G und dessen Komponentengraphen G ∗ . Benennen Sie dabei die starken Zusammenhangskomponenten von G mit a, b, c, . . . , in der Reihenfolge, in der sie vom Tarjan-Algorithmus im vorigen Aufgabenteil gefunden wurden. (2 Punkte) Wiederholung: Tarjan • Grundidee: Von einem Startknoten ausgehend • • • • Tiefensuche im Graphen durchzuführen. Die SZKn bilden dabei Teilbäume des Tiefensuchbaumes, die Wurzeln dieser Bäume heißen Wurzeln der ZK. Die Knoten werden in der Reihenfolge, in der sie besucht werden, auf einem Stack abgelegt. Kehrt die Tiefensuche aus einem Unterbaum zurück, werden die Knoten wieder vom Stack genommen und ausgegeben. Dabei testen, ob es sich bei dem Knoten um die Wurzel einer ZK handelt. Wenn ja, so bilden die bisher ausgegebenen Knoten eine SZK. Wiederholung: Tarjan • Führe Tiefensuche (DFS) auf G aus. • Berechne dabei l[v] = “frühester” Knoten, der von v erreichbar ist in der durch in[] gegebenen Reihenfolge. • Wenn alle Kindsknoten von v abgearbeitet sind und l[v]=in[v], so ist v die “Wurzel” einer SZK. Deren Knoten werden dann gleich ausgegeben und nicht mehr weiter betrachtet (denn jeder Knoten ist in nur einer Komponente). Wiederholung: Tarjan Wichtige Konzepte: • Knoten werden in Preorder-Reihenfolge (WLR) nummeriert. • Spannbaum: Kanten, die zu neuen Knoten führen • Wurzel einer SZK: der erste Knoten einer ZSK, der in der Tiefensuche besucht wird (hat die niedrigste Nummer). Wiederholung: Tarjan Beispiel: → Tiefensuche (preorder) Wiederholung: Tarjan Beispiel: → Tiefensuch-Spannbaum Wiederholung: Tarjan • Tiefensuche, Reihenfolge: in[] • Berechnung der “lowlinks” für jeden Knoten: l[v] • l[v] ist das Minimum aus in[v] und allen in[w], wobei • w zur selben SZK wie v gehört; • w von v durch eine (womöglich leere) Folge von Spannbaum-Kanten gefolgt von genau einer anderen Kante erreichbar ist. Wiederholung: Tarjan Beispiel: → Zusätzl. Info: low-links, l[g ] = in[d] = 6 Wiederholung: Tarjan Beispiel: → alle low-links (lila) Wiederholung: Tarjan Beispiel: → Ein Knoten ist eine Wurzel, wenn Preorder- und Lowlink-Zahl gleich sind Wiederholung: Tarjan Auffinden der SZK: • Tiefensuche mit Preorder-Nummerierung • Berechnung der Lowlinks • Zusẗzlich: “Tiefensuch-Zustände” auf Stack legen • Wenn der Algorithmus von einer Wurzel aus zurückgeht, so nimmt er sich selbst und alle Zustände über sich vom Stack runter; diese bilden eine SZK. Wiederholung: Tarjan Beispiel: → Tiefensuche beginnt bei a, kommt auf Stack Wiederholung: Tarjan Beispiel: → Tiefensuche geht weiter bis f , Stack wird gefüllt Wiederholung: Tarjan Beispiel: → Algorithmus gelangt zu e → e ist eine Wurzel (Preorder- und Lowlink-Zahl sind gleich) Wiederholung: Tarjan Beispiel: → Beim Zurückgehen von e wird {e, f } als SZK identifiziert und vom Stack entfernt Wiederholung: Tarjan Beispiel: → Beim Zurückgehen wird {b} als SZK identifiziert und entfernt, etc Wiederholung: Tarjan • Vorteil: Benötigt nur Vorwärtskanten, Graph wird nur einmal durchlaufen • Nachteil: Benötigt relativ viel Speicher (Zustandsstack sowie zwei Zahlen pro Knoten) Aufgabe 6 Geg: Gerichteter Graph, Kantenliste: 7, 10, 1, 2, 2, 3, 3, 4, 4, 2, 1, 5, 5, 4, 4, 6, 6, 7, 7, 6, 5, 7 a) Benutzen Sie den Tarjan-Algorithmus beginnend beim Knoten 1, um die starken Zusammenhangskomponenten von G zu berechnen. In der Schleife innerhalb von Tarjan-visit werden die Kindsknoten u des aktuellen Knotens v in aufsteigender Reihenfolge der Indizes bearbeitet. Geben Sie jeweils nach Beendigung dieser Schleife v, in[v] und l[v] an, sowie ggf. die vom Programm erzeugte Ausgabe einer starken Zusammenhangskomponente. (5 Punkte) Aufgabe 6 v in[v] 7 6 6 5 4 4 3 3 2 2 5 12 1 1 l[v] 5 5 2 2 2 12 1 Ausgabe SZK: 7, 6 SZK: 4, 3, 2 SZK: 5 SZK: 1 Aufgabe 6 c) Geben Sie eine topologische Sortierung von G ∗ an. Wiederholung: Topolog. Sort. Alle azyklischen Graphen sind topologisch sortierbar, z. B.: Aufgabe 6 c) Geben Sie eine topologische Sortierung von G ∗ an. (d,c,b,a) Aufgabe 6 d) Wie viele Kanten enthält die transitive reflexive Hülle von G ? Erklären Sie kurz, wie Sie durch Kenntnis von G ∗ diese Berechnung abkürzen können. (3 Punkte) Wiederholung: Hülle • Welche Knoten sind von einem gegebenen Knoten aus erreichbar? • Definition: Ein Digraph G ∗ = (V , E ∗ ) heißt reflexive, transitive Hülle (kurz: Hülle) eines Digraphen G = (V , E ), wenn für alle u, v ∈ V gilt: (u, v ) ∈ E ∗ ⇔ Es gibt einen Pfad von u nach v in G Aufgabe 6d Berechne die transitive reflexive Hülle von G ∗ . Eine Kante (x, y ) darin repräsentiert |a| × |b| Kanten in der Hülle von G selbst, wobei |.| die Anzahl Knoten in der starken Zusammenhangskomponente bezeichnet. Zusammengefasst haben wir |d|×(|a|+|b|+|c|+|d|) + |c|×(|a|+|b|+|c|) + |b|×(|a|+|b|) + |a|×|a| Kanten, das sind 1 × 7 + 1 × 6 + 3 × 5 + 2 × 2 = 32 Outlook