Algorithmen und Datenstrukturen Wintersemester 2012/13 22. Vorlesung Tiefensuche und Topologische Sortierung Prof. Dr. Alexander Wolff Lehrstuhl für Informatik I Vorlesungsumfrage Nutzen Sie die Vorlesungsbefragung – zu konstruktiver Kritik! Von besseren Vorlesungen profitieren ! Sie (wenn Sie die nächste Veranstaltung bei mir hören) Ihre Nachfolger (im nächsten Wintersemester) ich (Gute Lehre macht Spaß! Gute Klausurergebnisse auch!) Vielen Dank! Tiefensuche Eingabe: u (un)gerichteter Graph G discovery finish time time π 1/– 1/8 V Ausgabe: – Besuchsintervalle ( u . d / u . f ) 4/5 4/– π – DFS-Wald x v w 2/– 2/7 9/12 9/– K R 3/– 3/6 10/11 10/– z R – Klassifizierung der Graphkanten: Farbe Zielknoten: • Baumkanten (Kanten von Gπ ) weiss y Kanten des DFS-Baums (in Gegenrichtung) • Rückwärtskanten (R) grau Nicht-Baumkanten zu einem Vorgängerknoten • Vorwärtskanten (V) Nicht-Baumkanten zu einem Nachfolgerknoten • Kreuzkanten (K) Kanten, bei denen kein Endpunkt Vorgänger des anderen ist. schwarz und start.d < ziel.d schwarz und start.d > ziel.d Tiefensuche – Pseudocode u 1/8 DFS(Graph G = (V , E )) foreach u ∈ V do V R u .color = white 4/5 u .π = nil x time = 0 // globale Variable! foreach u ∈ V do if u .color == white then DFSVisit(G , u ) DFSVisit(Graph G , Vertex u ) time = time + 1 u .d = time; u .color = gray foreach v ∈ Adj[u ] do if v .color == white then v .π = u ; DFSVisit(G , v ) time = time + 1 u .f = time; u .color = black v w 2/7 9/12 K 3/6 y 10/11 z R Laufzeit von DFS? DFSVisit wird nur für weiße Knoten aufgerufen. In DFSVisit wird der neue Knoten sofort gefärbt. ⇒ DFSVisit wird für jeden Knoten genau 1× aufgerufen. DFS ohne if O(V ) Zeit DFSVisit ohne Rek. O(deg u) DFS gesamt O(V + E ) Zeit Tiefensuche – Eigenschaften 3/6 4/5 y z 2/9 7/8 x 1/10 w 12/13 s 11/16 14/15 v t u s z y (x x) y w w z s t v v u u t s t B z v u V R 1 2 y w x K 5 10 15 time Tiefensuche – Sätze Satz. (Klammerntheorem) V 2 Nach DFS(G ) gilt für {u , v } ∈ genau eine der Bedingungen (i) Besuchsintervalle disjunkt und Baumkanten enthalten weder u -v - noch v -u -Weg. (ii) [u .d , u .f ] ⊂ [v .d , v .f ] und Baumkanten enthalten v -u -Weg. (iii) Wie (ii), nur umgekehrt. Beweis. Wir betrachten zwei Fälle. 1. Fall: u .d < v .d . A) v .d < u .f ,. d.h. v wurde entdeckt, als u noch grau war. ⇒ v ist Nachfolger von u , d.h. es gibt einen u -v -Weg. Wegen u .d < v .d gilt: v wurde später als u entdeckt. ⇒ alle Kanten, die v verlassen sind erforscht; v wird schwarz, bevor DFG zu u zurückkehrt und u schwarz macht. ⇒ [v .d , v .f ] ⊂ [u .d , u .f ] X Tiefensuche – Sätze Satz. (Klammerntheorem) V 2 Nach DFS(G ) gilt für {u , v } ∈ genau eine der Bedingungen (i) Besuchsintervalle disjunkt und Baumkanten enthalten weder u -v - noch v -u -Weg. (ii) [u .d , u .f ] ⊂ [v .d , v .f ] und Baumkanten enthalten v -u -Weg. (iii) Wie (ii), nur umgekehrt. Beweis. Wir betrachten zwei Fälle. X X B) u .f < v .d . X 1. Fall: u .d < v .d . A) v .d < u .f . 2. Fall: v .d < u .d . Symmetrisch! X (Vertausche im Beweis u ↔ v .) Laut Code gilt u .d < u .f < v .d < v .f (siehe Code). ⇒ [u .d , u .f ] ∩ [v .d , v .f ] = ∅ ⇒ Keiner der beiden Knoten wurde entdeckt, während der andere noch grau war., d.h. keiner Nachf. des anderen. Noch mehr Sätze! Satz. (vom weißen Pfad) Der DFS-Wald von G enthält einen u -v -Weg ⇔ zum Zeitpunkt u .d , wenn u entdeckt wird, enthält G einen u -v -Weg, der nur aus weißen Knoten besteht. Satz. G ungerichtet ⇒ G hat nur Baum- und Rückwärtskanten. Beweis. Sei uv (kurz für {u , v }) eine beliebige Kante von G . O.B.d.A. gilt u .d < v .d . Dann entdeckt DFS v und färbt v schwarz, bevor u schwarz gefärbt wird (da v ∈ Adj[u ]). Falls DFS uv zum ersten Mal von u nach v überschreitet, ist v zu diesem Zeitpunkt weiss. Dann ist uv Baumkante. Andernfalls ist uv R-Kante, da u schon (und immer noch) grau ist, wenn uv zum 1. Mal überschritten wird (und zwar von v nach u ). Ablaufplanung Kante bedeutet: Unterhose vor Hose anziehen! 1/8 2/7 Hose 5/6 Gürtel 14/15 Schal Unterhose Socken 19/20 Schuhe 3/4 Uhr 9/10 T-Shirt 11/18 Anorak Pulli 12/17 DFS-Besuchsintervalle Topologische Sortierung: Lineare Ordnung der Knoten, so dass aus (u , v ) ∈ E folgt: u kommt vor v . 13/16 19/20 11/18 12/17 13/16 14/15 Socken T-Shirt Pulli Anorak Schal Uhr Unterhose Hose Gürtel Schuhe 9/10 1/8 2/7 5/6 3/4 Topologisch sortieren Topologische Sortierung: Lineare Ordnung der Knoten, so dass aus (u , v ) ∈ E folgt: u kommt vor v . Def. TopologicalSort(DirectedGraph G ) L = new List() Laufzeit? DFS(G ) mit folgender Änderung: Wenn ein Knoten schwarz gefärbt wird, O (V + E ) häng ihn vorne an die Liste L an. return L Beweise: Tafel bzw. Ein (gerichteter) Graph ist kreisfrei, Kapitel 22.4 wenn er keinen (gerichteten) Kreis enthält. [CLRS] Lem. Ein gerichteter Graph G ist kreisfrei ⇔ DFS(G ) liefert keine Rückwärtskanten. Satz. Sei G ein gerichteter kreisfreier Graph. Dann liefert TopologicalSort(G ) eine topologische Sortierung von G .