2. Seminar - bioinf leipzig

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