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: Ausgabe: (un)gerichteter Graph G discovery time Besuchsintervalle ( ) (u.d/u.f ) DFS-Wald π u π v w 1/ 1/8 4/ 4/5 Klassifizierung der Graphkanten: Baumkanten (Kanten von G π ) Rückwärtskanten (R) finish time Kanten des DFS-Baums (in Gegenrichtung) Nicht-Baumkanten zu einem Vorgängerknoten V R 2/ 2/7 3/ 3/6 K x y z weiss grau 9/12 9/ 10/11 10/ R Farbe Zielknoten: 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 DFS(Graph G = (V, E)) foreach u V do u.color = white u.π = nil 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 u v w 1/8 V R 2/7 4/5 3/6 K x y z 9/12 10/11 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 y z s t 2/9 1/10 11/16 ( s 4/5 x 7/8 w ( z ( y (x x) y ) ( w w ) ) z 12/13 ) ( s t v ( ) ( ) v v u u 14/15 ) t u B y R x s t z v u V w K 1 2 5 10 15 time
Tiefensuche Sätze Satz. (Klammerntheorem) Nach DFS(G) gilt für {u, v} ( V 2) 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 ]
Tiefensuche Sätze Satz. (Klammerntheorem) Nach DFS(G) gilt für {u, v} ( V 2) 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. 2. Fall: v.d < u.d. Symmetrisch! A) v.d < u.f. B) u.f < v.d. (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. 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. 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 Hose Gürtel Unterhose Socken 19/20 Schuhe 2/7 3/4 Uhr 5/6 9/10 14/15 Schal T-Shirt 11/18 13/16 Anorak Pulli 12/17 Topologische Sortierung: Lineare Ordnung der Knoten, so dass aus (u, v) E folgt: u kommt vor v. DFS-Besuchsintervalle 19/20 Socken 11/18 T-Shirt 12/17 Pulli 13/16 Anorak 14/15 Schal Uhr 9/10 Unterhose 1/8 Hose 2/7 Gürtel 5/6 Schuhe 3/4
Topologisch sortieren Topologische Sortierung: Lineare Ordnung der Knoten, so dass aus (u, v) E folgt: u kommt vor v. Def. Lem. Satz. TopologicalSort(DirectedGraph G) L = new List() DFS(G) mit folgender Änderung: Wenn ein Knoten schwarz gefärbt wird, häng ihn vorne an die Liste L an. return L Ein (gerichteter) Graph ist kreisfrei, wenn er keinen (gerichteten) Kreis enthält. Ein gerichteter Graph G ist kreisfrei DFS(G) liefert keine Rückwärtskanten. Laufzeit? O(V + E) Beweise: Tafel bzw. Kapitel 22.4 [CLRS] Sei G ein gerichteter kreisfreier Graph. Dann liefert TopologicalSort(G) eine topologische Sortierung von G.