tarjans algorithmus zur bestimmung der starken zusammenhangs- komponenten
DESCRIPTION
Tarjans Algorithmus zur Bestimmung der starken Zusammenhangs- komponenten. Katja Losemann Chris Schwiegelshohn. Idee. G = gerichteter Graph Gesucht sind alle starken Zusammenhangskomponenten (SZK) Einmalige Tiefensuche durch den Graph reicht aus - PowerPoint PPT PresentationTRANSCRIPT
![Page 1: Tarjans Algorithmus zur Bestimmung der starken Zusammenhangs- komponenten](https://reader033.vdocuments.pub/reader033/viewer/2022051516/5681351f550346895d9c810a/html5/thumbnails/1.jpg)
Katja LosemannChris Schwiegelshohn
![Page 2: Tarjans Algorithmus zur Bestimmung der starken Zusammenhangs- komponenten](https://reader033.vdocuments.pub/reader033/viewer/2022051516/5681351f550346895d9c810a/html5/thumbnails/2.jpg)
G = <V,E> gerichteter Graph
Gesucht sind alle starken Zusammenhangskomponenten (SZK)
Einmalige Tiefensuche durch den Graph reicht aus
SZK werden durch Wurzeln der DFS-Teilbäume eindeutig identifiziert
![Page 3: Tarjans Algorithmus zur Bestimmung der starken Zusammenhangs- komponenten](https://reader033.vdocuments.pub/reader033/viewer/2022051516/5681351f550346895d9c810a/html5/thumbnails/3.jpg)
dfs_index(v): Reihenfolge der DFS-Aufrufe
Stack S wird in der Reihenfolge der besuchten Knoten befüllt
Bei Rückkehr Überprüfung ob aktueller Knoten v die Wurzel einer SZK
Wenn eine Wurzel gefunden wurde, bilden alle Knoten des Stacks bis zu dieser Wurzel eine SZK
![Page 4: Tarjans Algorithmus zur Bestimmung der starken Zusammenhangs- komponenten](https://reader033.vdocuments.pub/reader033/viewer/2022051516/5681351f550346895d9c810a/html5/thumbnails/4.jpg)
zusätzlicher Wert lowlink(v) für alle v mit
lowlink(v) =min ( {num[v]} {num[x] | v→*−x )
v Wurzel, wenn lowlink(v) = dfs(v)
![Page 5: Tarjans Algorithmus zur Bestimmung der starken Zusammenhangs- komponenten](https://reader033.vdocuments.pub/reader033/viewer/2022051516/5681351f550346895d9c810a/html5/thumbnails/5.jpg)
Eingabe Graph G ( V, E )
current_dfs := 0V‘ := VS = ∅ // S ist der Stackwhile ( V‘ not emtpy)
tarjan ( v ) // v ∊ V‘
![Page 6: Tarjans Algorithmus zur Bestimmung der starken Zusammenhangs- komponenten](https://reader033.vdocuments.pub/reader033/viewer/2022051516/5681351f550346895d9c810a/html5/thumbnails/6.jpg)
Tarjan ( v ) :dfs_index( v ) := current_dfslowlink( v ) := current_dfsS.push ( v )current_dfs ++V‘ = V \ { v }For ( v1 | ( v, v1 ) ∊ E )
if ( v1 ∊ V‘ )tarjan ( v1 )lowlink( v ) := min ( lowlink( v ),
lowlink( v1 ) )
![Page 7: Tarjans Algorithmus zur Bestimmung der starken Zusammenhangs- komponenten](https://reader033.vdocuments.pub/reader033/viewer/2022051516/5681351f550346895d9c810a/html5/thumbnails/7.jpg)
else if (v1 ∊ S )
lowlink( v ) := min ( lowlink( v ), dfs_index( v1 ) )
If ( lowlink( v ) = dfs_index( v ) )repeat
k = S.pop( )//Ausgabe
until ( k = v )
![Page 8: Tarjans Algorithmus zur Bestimmung der starken Zusammenhangs- komponenten](https://reader033.vdocuments.pub/reader033/viewer/2022051516/5681351f550346895d9c810a/html5/thumbnails/8.jpg)
dfs(v)
lowlink(v))
0
1
2 3
4
5
6 7
8 9
SZK 1
lowlink(1) = 1
lowlink(5) = 2
lowlink(4) = 2
lowlink(9) = 6
lowlink(8) = 6
lowlink(7) = 6
lowlink(6) = 6
lowlink(3) = 0
lowlink(2) = 0
lowlink(10) = 3
lowlink(0) = 0
lowlink(12) = 11SZK 6,7,8,9
SZK 0,2,3,4,5
10 12 11
lowlink(11) = 11SZK 11,12
Stack:
0123456789
10
1112
![Page 9: Tarjans Algorithmus zur Bestimmung der starken Zusammenhangs- komponenten](https://reader033.vdocuments.pub/reader033/viewer/2022051516/5681351f550346895d9c810a/html5/thumbnails/9.jpg)
Fall 1: (v‘‘,v‘) Vorwärtskante◦ Dann dfs(v‘) > dfs(v‘‘) trägt nicht zum Min bei
Fall 2: (v‘‘,v‘) Rückwärtskante◦ Dann v‘ noch auf dem Stack und in gleicher SZK
Fall 3: (v‘‘,v‘) Querkante◦ Entweder nicht im Stack und in nächster SZK,◦ oder nicht im Stack und in gleicher SZK, dann
aber normale Baumkante
![Page 10: Tarjans Algorithmus zur Bestimmung der starken Zusammenhangs- komponenten](https://reader033.vdocuments.pub/reader033/viewer/2022051516/5681351f550346895d9c810a/html5/thumbnails/10.jpg)
lowlink garantiert, dass es immer einen Weg zu einem Knoten höher im DFS-Baum als der aktuelle Knoten existiert
lowlink(v) = dfs(v)⇒ Kein Knoten oberhalb von v kommt für SZK
in Frage Mit der letzten Kante kommt man nicht in
eine SZK, die nicht aktuell und auf dem Stack liegt.
Wäre ein Weg nur in einer Richtung vorhanden, wäre lowlink(v) = dfs(v)
![Page 11: Tarjans Algorithmus zur Bestimmung der starken Zusammenhangs- komponenten](https://reader033.vdocuments.pub/reader033/viewer/2022051516/5681351f550346895d9c810a/html5/thumbnails/11.jpg)
Aber ist das effizient berechenbar? Tarjan muss für jeden Knoten einmal
aufgerufen werden Die Berechnung von dfs und lowlink erfolgt
rekursiv über alle angrenzenden Kanten Insgesamt wird jede Kante maximal 2x
betrachtet, damit: O( |V| + |E| )