Top Banner
Katja Losemann Chris Schwiegelshohn
11

Tarjans Algorithmus zur Bestimmung der starken Zusammenhangs- komponenten

Jan 03, 2016

Download

Documents

mason-kramer

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 Presentation
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Tarjans  Algorithmus zur Bestimmung der starken Zusammenhangs-  komponenten

Katja LosemannChris Schwiegelshohn

Page 2: Tarjans  Algorithmus zur Bestimmung der starken Zusammenhangs-  komponenten

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

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

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

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

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

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

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

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

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

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| )