LS 2 / Informatik Datenstrukturen, Algorithmen und Programmierung 2 (DAP2) LS 2 / Informatik Graphalgorithmen Das transitive Hülle Problem Gegeben sei ein gerichteter, ungewichteter Graph G=(V,E) Gesucht: Die transitive Hülle G*=(V,E*) von G, wobei E*={(u,v): es gibt Weg von u nach v in G} G G* 2 LS 2 / Informatik Graphalgorithmen Transitive Hülle in O(|V|³) Zeit mit Floyd-Warshall In O(|V|²+|V| |E|) Zeit mit Breiten- oder Tiefensuche von jedem Knoten Geht das auch schneller? 3 LS 2 / Informatik Graphalgorithmen Graphen und Matrixmultiplikation Sei A die nn-Adjazenzmatrix eines ungerichteten Graphen G mit Knotenmenge {1,…,n} Was ist AA? 4 LS 2 / Informatik Graphalgorithmen Behauptung 62 Sei Z= AA. Dann gilt z ij >0, g.d.w. es in G einen Pfad der Länge 2 von Knoten i zu Knoten j gibt. 5 LS 2 / Informatik Graphalgorithmen Behauptung 63 Sei Z‘= AA + A. Dann gilt, dass z‘ij >0, g.d.w. es einen Weg der Länge 1 oder 2 von Knoten i zu Knoten j gibt. Beweis • Folgt sofort aus dem vorhergehenden Lemma und der Tatsache, dass A genau für die Paare i,j einen Eintrag 1 hat, die durch eine Kante (einen Weg der Länge 1) verbunden sind Konstruiere Matrix B mit: bij =1 z‘ij >0 6 LS 2 / Informatik Graphalgorithmen Behauptung 64 Der durch Matrix B definierte Graph hat einen Weg von Knoten i nach j, g.d.w. der durch Matrix A definierte Graph einen solchen Weg hat. Beweis Folgt aus der vorherigen Behauptung. 7 LS 2 / Informatik Graphalgorithmen Behauptung 65 Sei P ein Weg der Länge k>1 in G von Knoten i zu Knoten j. Dann gibt es in dem von Matrix B beschriebenen Graphen G‘ einen Weg von i nach j mit Länge maximal 2/3 k. 8 LS 2 / Informatik Graphalgorithmen Behauptung 65 Sei P ein Weg der Länge k>1 in G von Knoten i zu Knoten j. Dann gibt es in dem von Matrix B beschriebenen Graphen G‘ einen Weg von i nach j mit Länge maximal 2/3 k. Beweis • Sei P ein Weg in G mit k Kanten. 9 LS 2 / Informatik Graphalgorithmen Behauptung 65 Sei P ein Weg der Länge k>1 in G von Knoten i zu Knoten j. Dann gibt es in dem von Matrix B beschriebenen Graphen G‘ einen Weg von i nach j mit Länge maximal 2/3 k. Beweis • • Sei P ein Weg in G mit k Kanten. Ist k gerade, dann gibt es in G‘ einen Weg der Länge k/2, da man jeweils zwei aufeinanderfolgende Kanten von P durch eine Kante in G‘ ersetzen kann. 10 LS 2 / Informatik Graphalgorithmen Behauptung 65 Sei P ein Weg der Länge k>1 in G von Knoten i zu Knoten j. Dann gibt es in dem von Matrix B beschriebenen Graphen G‘ einen Weg von i nach j mit Länge maximal 2/3 k. Beweis • • • Sei P ein Weg in G mit k Kanten. Ist k gerade, dann gibt es in G‘ einen Weg der Länge k/2, da man jeweils zwei aufeinanderfolgende Kanten von P durch eine Kante in G‘ ersetzen kann. Ist k ungerade, dann gibt es in G‘ einen Weg der Länge k/2, da man bis auf die letzte Kante jeweils zwei aufeinanderfolgende Kanten von P durch eine Kante in G‘ ersetzen kann. 11 LS 2 / Informatik Graphalgorithmen Behauptung 65 Sei P ein Weg der Länge k>1 in G von Knoten i zu Knoten j. Dann gibt es in dem von Matrix B beschriebenen Graphen G‘ einen Weg von i nach j mit Länge maximal 2/3 k. Beweis • • • • Sei P ein Weg in G mit k Kanten. Ist k gerade, dann gibt es in G‘ einen Weg der Länge k/2, da man jeweils zwei aufeinanderfolgende Kanten von P durch eine Kante in G‘ ersetzen kann. Ist k ungerade, dann gibt es in G‘ einen Weg der Länge k/2, da man bis auf die letzte Kante jeweils zwei aufeinanderfolgende Kanten von P durch eine Kante in G‘ ersetzen kann. Somit gilt für k=3, dass die Länge des Weges in G‘ 2/3 der Länge des Weges in G ist. Für k>3 verkürtzt sich die Weglänge entsprechend mehr. 12 LS 2 / Informatik Graphalgorithmen Behauptung 65 Sei P ein Weg der Länge k>1 in G von Knoten i zu Knoten j. Dann gibt es in dem von Matrix B beschriebenen Graphen G‘ einen Weg von i nach j mit Länge maximal 2/3 k. Beweis • • • • Sei P ein Weg in G mit k Kanten. Ist k gerade, dann gibt es in G‘ einen Weg der Länge k/2, da man jeweils zwei aufeinanderfolgende Kanten von P durch eine Kante in G‘ ersetzen kann. Ist k ungerade, dann gibt es in G‘ einen Weg der Länge k/2, da man bis auf die letzte Kante jeweils zwei aufeinanderfolgende Kanten von P durch eine Kante in G‘ ersetzen kann. Somit gilt für k=3, dass die Länge des Weges in G‘ 2/3 der Länge des Weges in G ist. Für k>3 verkürtzt sich die Weglänge entsprechend mehr. 13 LS 2 / Informatik Graphalgorithmen Konsequenz aus Beh. 64 und 65 Wenn wir die Berechnung von B log 3/2 n mal iterieren, haben wir die transitive Hülle berechnet 14 LS 2 / Informatik Graphalgorithmen TransitiveHülle(A) 1. for i1 to log3/2 n do 2. Z‘ A A+A 3. for i1 to n do 4. for j1 to n do 5. if z ij >0 then bij 1 else bij 0 6. AB 7. return A 15 LS 2 / Informatik Graphalgorithmen TransitiveHülle(A) 1. for i1 to log3/2 n do 2. Z‘ A A+A 3. for i1 to n do 4. for j1 to n do 5. if z ij >0 then bij 1 else bij 0 6. AB 7. return A Laufzeit O(log n) O(M(n) log n) O(n log n) O(n² log n) O(n² log n) O(n² log n) O(1) M(n): Zeit um zwei nn-Matrizen zu multiplizieren 16 LS 2 / Informatik Graphalgorithmen Satz 66 Der Algorithmus TransitiveHülle berechnet die transitive Hülle eines Graphen G in O(M(n) log n) Zeit, wobei M(n) die Laufzeit zur Multiplikation zweier nn-Matrizen bezeichnet. 17 LS 2 / Informatik Graphalgorithmen Noch ein Graphtraversierungsalgorithmus 18 LS 2 / Informatik Graphalgorithmen Breitensuche Durchlauf verbundenen Graph von Startknoten s Berechne kürzeste Wege (Anzahl Kanten) von s zu anderen Knoten im Graph Eingabegraph in Adjazenzlistendarstellung Laufzeit O(|V|+|E|) 19 LS 2 / Informatik Graphalgorithmen Breitensuche s 20 LS 2 / Informatik Graphalgorithmen Breitensuche s 0 21 LS 2 / Informatik Graphalgorithmen Breitensuche 1 s 0 22 LS 2 / Informatik Graphalgorithmen Breitensuche 1 s 0 1 23 LS 2 / Informatik Graphalgorithmen Breitensuche 1 2 s 0 1 24 LS 2 / Informatik Graphalgorithmen Breitensuche 1 2 s 0 1 2 25 LS 2 / Informatik Graphalgorithmen Breitensuche 1 2 s 3 0 1 2 26 LS 2 / Informatik Graphalgorithmen Breitensuche Vorgängergraph G enthält alle Kanten (p[v],v). p[v] 1 2 s 3 0 v 1 2 27 LS 2 / Informatik Graphalgorithmen Tiefensuche Suche zunächst „tiefer“ im Graph Neue Knoten werden immer vom zuletzt gefundenen Knoten entdeckt Sind alle adjazenten Knoten des zuletzt gefundenen Knoten v bereits entdeckt, springe zurück zum Knoten, von dem aus v entdeckt wurde Wenn irgendwelche unentdeckten Knoten übrigbleiben, starte Tiefensuche von einem dieser Knoten 28 LS 2 / Informatik Graphalgorithmen Tiefensuche s 29 LS 2 / Informatik Graphalgorithmen Tiefensuche s 30 LS 2 / Informatik Graphalgorithmen Tiefensuche s 31 LS 2 / Informatik Graphalgorithmen Tiefensuche s 32 LS 2 / Informatik Graphalgorithmen Tiefensuche s 33 LS 2 / Informatik Graphalgorithmen Tiefensuche s 34 LS 2 / Informatik Graphalgorithmen Tiefensuche s 35 LS 2 / Informatik Graphalgorithmen Invariante Tiefensuche Zu Beginn: alle Knoten weiß Entdeckte Knoten werden grau Abgearbeitete Knoten werden schwarz Zwei Zeitstempel: d[v] und f[v] (liegen zwischen 1 und 2 |V|) d[v]: v ist entdeckt f[v]: v ist abgearbeitet 36 LS 2 / Informatik Graphalgorithmen Zeitstempel der Tiefensuche d[v] < f[v] Vor d[v] ist v weiß Zwischen d[v] und f[v] ist v grau Nach f[v] ist v schwarz 37 LS 2 / Informatik Graphalgorithmen DFS(G) 1. for each vertex uV do color[u] weiß ; p[u] nil 2. time 0 3. for each vertex uV do 4. if color[u]=weiß then DFS-Visit(u) DFS-Visit(u) 1. color[u] grau 2. time time +1; d[u] time 4. for each vAdj[u] do 5. if color[v] = weiß then p[v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time 38 LS 2 / Informatik Graphalgorithmen DFS(G) 1. for each vertex uV do color[u] weiß ; p[u] nil 2. time 0 3. for each vertex uV do 4. if color[u]=weiß then DFS-Visit(u) DFS-Visit(u) 1. color[u] grau 2. time time +1; d[u] time 4. for each vAdj[u] do 5. if color[v] = weiß then p[v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time 39 LS 2 / Informatik Graphalgorithmen time=0 DFS(G) 1. for each vertex uV do color[u] weiß ; p[u] nil 2. time 0 3. for each vertex uV do 4. if color[u]=weiß then DFS-Visit(u) DFS-Visit(u) 1. color[u] grau 2. time time +1; d[u] time 4. for each vAdj[u] do 5. if color[v] = weiß then p[v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time 40 LS 2 / Informatik Graphalgorithmen time=0 DFS(G) 1. for each vertex uV do color[u] weiß ; p[u] nil 2. time 0 3. for each vertex uV do 4. if color[u]=weiß then DFS-Visit(u) u DFS-Visit(u) 1. color[u] grau 2. time time +1; d[u] time 4. for each vAdj[u] do 5. if color[v] = weiß then p[v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time 41 LS 2 / Informatik Graphalgorithmen time=0 DFS(G) 1. for each vertex uV do color[u] weiß ; p[u] nil 2. time 0 3. for each vertex uV do 4. if color[u]=weiß then DFS-Visit(u) u DFS-Visit(u) 1. color[u] grau 2. time time +1; d[u] time 4. for each vAdj[u] do 5. if color[v] = weiß then p[v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time 42 LS 2 / Informatik Graphalgorithmen time=0 DFS(G) 1. for each vertex uV do color[u] weiß ; p[u] nil 2. time 0 3. for each vertex uV do 4. if color[u]=weiß then DFS-Visit(u) u DFS-Visit(u) 1. color[u] grau 2. time time +1; d[u] time 4. for each vAdj[u] do 5. if color[v] = weiß then p[v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time 43 LS 2 / Informatik Graphalgorithmen time=1 DFS(G) 1. for each vertex uV do color[u] weiß ; p[u] nil 2. time 0 3. for each vertex uV do 4. if color[u]=weiß then DFS-Visit(u) u 1 DFS-Visit(u) 1. color[u] grau 2. time time +1; d[u] time 4. for each vAdj[u] do 5. if color[v] = weiß then p[v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time 44 LS 2 / Informatik Graphalgorithmen time=1 DFS(G) 1. for each vertex uV do color[u] weiß ; p[u] nil 2. time 0 3. for each vertex uV do 4. if color[u]=weiß then DFS-Visit(u) u 1 DFS-Visit(u) 1. color[u] grau 2. time time +1; d[u] time 4. for each vAdj[u] do 5. if color[v] = weiß then p[v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time v 45 LS 2 / Informatik Graphalgorithmen time=1 DFS(G) 1. for each vertex uV do color[u] weiß ; p[u] nil 2. time 0 3. for each vertex uV do 4. if color[u]=weiß then DFS-Visit(u) u 1 DFS-Visit(u) 1. color[u] grau 2. time time +1; d[u] time 4. for each vAdj[u] do 5. if color[v] = weiß then p[v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time v 46 LS 2 / Informatik Graphalgorithmen time=1 DFS(G) 1. for each vertex uV do color[u] weiß ; p[u] nil 2. time 0 3. for each vertex uV do 4. if color[u]=weiß then DFS-Visit(u) u 1 DFS-Visit(u) 1. color[u] grau 2. time time +1; d[u] time 4. for each vAdj[u] do 5. if color[v] = weiß then p[v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time 47 LS 2 / Informatik Graphalgorithmen time=2 DFS(G) 1. for each vertex uV do color[u] weiß ; p[u] nil 2. time 0 3. for each vertex uV do 4. if color[u]=weiß then DFS-Visit(u) u 2 1 DFS-Visit(u) 1. color[u] grau 2. time time +1; d[u] time 4. for each vAdj[u] do 5. if color[v] = weiß then p[v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time 48 LS 2 / Informatik Graphalgorithmen time=2 DFS(G) 1. for each vertex uV do color[u] weiß ; p[u] nil 2. time 0 3. for each vertex uV do 4. if color[u]=weiß then DFS-Visit(u) u v 2 1 DFS-Visit(u) 1. color[u] grau 2. time time +1; d[u] time 4. for each vAdj[u] do 5. if color[v] = weiß then p[v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time 49 LS 2 / Informatik Graphalgorithmen time=2 DFS(G) 1. for each vertex uV do color[u] weiß ; p[u] nil 2. time 0 3. for each vertex uV do 4. if color[u]=weiß then DFS-Visit(u) u 2 1 DFS-Visit(u) 1. color[u] grau 2. time time +1; d[u] time 4. for each vAdj[u] do 5. if color[v] = weiß then p[v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time 50 LS 2 / Informatik Graphalgorithmen time=2 DFS(G) 1. for each vertex uV do color[u] weiß ; p[u] nil 2. time 0 3. for each vertex uV do 4. if color[u]=weiß then DFS-Visit(u) u 2 1 DFS-Visit(u) 1. color[u] grau 2. time time +1; d[u] time 4. for each vAdj[u] do 5. if color[v] = weiß then p[v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time 51 LS 2 / Informatik Graphalgorithmen time=3 DFS(G) 1. for each vertex uV do color[u] weiß ; p[u] nil 2. time 0 3. for each vertex uV do 4. if color[u]=weiß then DFS-Visit(u) u 3 2 1 DFS-Visit(u) 1. color[u] grau 2. time time +1; d[u] time 4. for each vAdj[u] do 5. if color[v] = weiß then p[v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time 52 LS 2 / Informatik Graphalgorithmen time=3 DFS(G) 1. for each vertex uV do color[u] weiß ; p[u] nil 2. time 0 3. for each vertex uV do 4. if color[u]=weiß then DFS-Visit(u) u 3 2 1 DFS-Visit(u) 1. color[u] grau 2. time time +1; d[u] time 4. for each vAdj[u] do 5. if color[v] = weiß then p[v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time 53 LS 2 / Informatik Graphalgorithmen time=3 DFS(G) 1. for each vertex uV do color[u] weiß ; p[u] nil 2. time 0 3. for each vertex uV do 4. if color[u]=weiß then DFS-Visit(u) u 3 2 1 DFS-Visit(u) 1. color[u] grau 2. time time +1; d[u] time 4. for each vAdj[u] do 5. if color[v] = weiß then p[v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time 54 LS 2 / Informatik Graphalgorithmen time=4 DFS(G) 1. for each vertex uV do color[u] weiß ; p[u] nil 2. time 0 3. for each vertex uV do 4. if color[u]=weiß then DFS-Visit(u) 4 3 2 1 DFS-Visit(u) 1. color[u] grau 2. time time +1; d[u] time 4. for each vAdj[u] do 5. if color[v] = weiß then p[v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time 55 LS 2 / Informatik Graphalgorithmen time=4 DFS(G) 1. for each vertex uV do color[u] weiß ; p[u] nil 2. time 0 3. for each vertex uV do 4. if color[u]=weiß then DFS-Visit(u) 1 DFS-Visit(u) 1. color[u] grau 2. time time +1; d[u] time 4. for each vAdj[u] do 5. if color[v] = weiß then p[v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time u 4 3 2 v 56 LS 2 / Informatik Graphalgorithmen time=4 DFS(G) 1. for each vertex uV do color[u] weiß ; p[u] nil 2. time 0 3. for each vertex uV do 4. if color[u]=weiß then DFS-Visit(u) 1 DFS-Visit(u) 1. color[u] grau 2. time time +1; d[u] time 4. for each vAdj[u] do 5. if color[v] = weiß then p[v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time u 4 3 2 v 57 LS 2 / Informatik Graphalgorithmen time=4 DFS(G) 1. for each vertex uV do color[u] weiß ; p[u] nil 2. time 0 3. for each vertex uV do 4. if color[u]=weiß then DFS-Visit(u) 1 DFS-Visit(u) 1. color[u] grau 2. time time +1; d[u] time 4. for each vAdj[u] do 5. if color[v] = weiß then p[v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time 4 3 2 u 58 LS 2 / Informatik Graphalgorithmen time=5 DFS(G) 1. for each vertex uV do color[u] weiß ; p[u] nil 2. time 0 3. for each vertex uV do 4. if color[u]=weiß then DFS-Visit(u) 1 DFS-Visit(u) 1. color[u] grau 2. time time +1; d[u] time 4. for each vAdj[u] do 5. if color[v] = weiß then p[v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time 4 3 2 u 5 59 LS 2 / Informatik Graphalgorithmen time=5 DFS(G) 1. for each vertex uV do color[u] weiß ; p[u] nil 2. time 0 3. for each vertex uV do 4. if color[u]=weiß then DFS-Visit(u) 1 DFS-Visit(u) 1. color[u] grau 2. time time +1; d[u] time 4. for each vAdj[u] do 5. if color[v] = weiß then p[v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time 4 3 v 2 u 5 60 LS 2 / Informatik Graphalgorithmen time=5 DFS(G) 1. for each vertex uV do color[u] weiß ; p[u] nil 2. time 0 3. for each vertex uV do 4. if color[u]=weiß then DFS-Visit(u) 1 DFS-Visit(u) 1. color[u] grau 2. time time +1; d[u] time 4. for each vAdj[u] do 5. if color[v] = weiß then p[v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time 4 3 v 2 u 5 61 LS 2 / Informatik Graphalgorithmen time=5 DFS(G) 1. for each vertex uV do color[u] weiß ; p[u] nil 2. time 0 3. for each vertex uV do 4. if color[u]=weiß then DFS-Visit(u) 1 DFS-Visit(u) 1. color[u] grau 2. time time +1; d[u] time 4. for each vAdj[u] do 5. if color[v] = weiß then p[v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time 4 3 v 2 u 5 62 LS 2 / Informatik Graphalgorithmen time=6 DFS(G) 1. for each vertex uV do color[u] weiß ; p[u] nil 2. time 0 3. for each vertex uV do 4. if color[u]=weiß then DFS-Visit(u) 4 3 u 2 6 1 DFS-Visit(u) 1. color[u] grau 2. time time +1; d[u] time 4. for each vAdj[u] do 5. if color[v] = weiß then p[v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time 5 63 LS 2 / Informatik Graphalgorithmen time=6 DFS(G) 1. for each vertex uV do color[u] weiß ; p[u] nil 2. time 0 3. for each vertex uV do v 4. if color[u]=weiß then DFS-Visit(u) 4 3 u 2 6 1 DFS-Visit(u) 1. color[u] grau 2. time time +1; d[u] time 4. for each vAdj[u] do 5. if color[v] = weiß then p[v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time 5 64 LS 2 / Informatik Graphalgorithmen time=7 DFS(G) 1. for each vertex uV do color[u] weiß ; p[u] nil 2. time 0 3. for each vertex uV do v 4. if color[u]=weiß then DFS-Visit(u) 4 3 7 2 6 1 DFS-Visit(u) 1. color[u] grau 2. time time +1; d[u] time 4. for each vAdj[u] do 5. if color[v] = weiß then p[v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time 5 65 LS 2 / Informatik Graphalgorithmen time=7 DFS(G) 1. for each vertex uV do color[u] weiß ; p[u] nil 2. time 0 3. for each vertex uV do 4. if color[u]=weiß then DFS-Visit(u) 1 DFS-Visit(u) 1. color[u] grau 2. time time +1; d[u] time 4. for each vAdj[u] do 5. if color[v] = weiß then p[v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time 4 3 7 2 6 u 5 66 LS 2 / Informatik Graphalgorithmen time=8 DFS(G) 1. for each vertex uV do color[u] weiß ; p[u] nil 2. time 0 3. for each vertex uV do 4. if color[u]=weiß then DFS-Visit(u) 1 DFS-Visit(u) 1. color[u] grau 2. time time +1; d[u] time 4. for each vAdj[u] do 5. if color[v] = weiß then p[v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time 4 3 7 2 6 8 5 67 LS 2 / Informatik Graphalgorithmen time=8 DFS(G) 1. for each vertex uV do color[u] weiß ; p[u] nil 2. time 0 3. for each vertex uV do 4. if color[u]=weiß then DFS-Visit(u) 1 DFS-Visit(u) 1. color[u] grau 2. time time +1; d[u] time 4. for each vAdj[u] do 5. if color[v] = weiß then p[v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time u 4 3 7 2 6 8 5 68 LS 2 / Informatik Graphalgorithmen time=9 DFS(G) 1. for each vertex uV do color[u] weiß ; p[u] nil 2. time 0 3. for each vertex uV do 4. if color[u]=weiß then DFS-Visit(u) 1 DFS-Visit(u) 1. color[u] grau 2. time time +1; d[u] time 4. for each vAdj[u] do 5. if color[v] = weiß then p[v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time 9 4 3 7 2 6 8 5 69 LS 2 / Informatik Graphalgorithmen time=9 DFS(G) 1. for each vertex uV do color[u] weiß ; p[u] nil 2. time 0 3. for each vertex uV do u 4. if color[u]=weiß then DFS-Visit(u) 1 DFS-Visit(u) 1. color[u] grau 2. time time +1; d[u] time 4. for each vAdj[u] do 5. if color[v] = weiß then p[v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time 9 4 3 7 2 6 v 8 5 70 LS 2 / Informatik Graphalgorithmen time=9 DFS(G) 1. for each vertex uV do color[u] weiß ; p[u] nil 2. time 0 3. for each vertex uV do u 4. if color[u]=weiß then DFS-Visit(u) 1 DFS-Visit(u) 1. color[u] grau 2. time time +1; d[u] time 4. for each vAdj[u] do 5. if color[v] = weiß then p[v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time 9 4 3 7 2 6 v 8 5 71 LS 2 / Informatik Graphalgorithmen time=9 DFS(G) 1. for each vertex uV do color[u] weiß ; p[u] nil 2. time 0 3. for each vertex uV do 4. if color[u]=weiß then DFS-Visit(u) 1 DFS-Visit(u) 1. color[u] grau 2. time time +1; d[u] time 4. for each vAdj[u] do 5. if color[v] = weiß then p[v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time 9 4 3 7 2 6 u 8 5 72 LS 2 / Informatik Graphalgorithmen time=10 DFS(G) 1. for each vertex uV do color[u] weiß ; p[u] nil 2. time 0 3. for each vertex uV do 4. if color[u]=weiß then DFS-Visit(u) 1 DFS-Visit(u) 1. color[u] grau 2. time time +1; d[u] time 4. for each vAdj[u] do 5. if color[v] = weiß then p[v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time 9 4 3 7 2 6 u 8 10 5 73 LS 2 / Informatik Graphalgorithmen time=10 DFS(G) 1. for each vertex uV do color[u] weiß ; p[u] nil 2. time 0 3. for each vertex uV do 4. if color[u]=weiß then DFS-Visit(u) 1 DFS-Visit(u) 1. color[u] grau 2. time time +1; d[u] time 4. for each vAdj[u] do 5. if color[v] = weiß then p[v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time 9 4 v 3 7 2 6 u 8 10 5 74 LS 2 / Informatik Graphalgorithmen time=10 DFS(G) 1. for each vertex uV do color[u] weiß ; p[u] nil 2. time 0 3. for each vertex uV do 4. if color[u]=weiß then DFS-Visit(u) 1 DFS-Visit(u) 1. color[u] grau 2. time time +1; d[u] time 4. for each vAdj[u] do 5. if color[v] = weiß then p[v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time 9 4 v 3 7 2 6 u 8 10 5 75 LS 2 / Informatik Graphalgorithmen time=10 DFS(G) 1. for each vertex uV do color[u] weiß ; p[u] nil 2. time 0 3. for each vertex uV do 4. if color[u]=weiß then DFS-Visit(u) 1 DFS-Visit(u) 1. color[u] grau 2. time time +1; d[u] time 4. for each vAdj[u] do 5. if color[v] = weiß then p[v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time 9 4 3 7 2 6 u 8 v 10 5 76 LS 2 / Informatik Graphalgorithmen time=10 DFS(G) 1. for each vertex uV do color[u] weiß ; p[u] nil 2. time 0 3. for each vertex uV do 4. if color[u]=weiß then DFS-Visit(u) 1 DFS-Visit(u) 1. color[u] grau 2. time time +1; d[u] time 4. for each vAdj[u] do 5. if color[v] = weiß then p[v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time 9 4 3 7 2 6 u 8 v 10 5 77 LS 2 / Informatik Graphalgorithmen time=10 DFS(G) 1. for each vertex uV do color[u] weiß ; p[u] nil 2. time 0 3. for each vertex uV do 4. if color[u]=weiß then DFS-Visit(u) 1 DFS-Visit(u) 1. color[u] grau 2. time time +1; d[u] time 4. for each vAdj[u] do 5. if color[v] = weiß then p[v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time 9 4 3 7 2 6 u 8 v 10 5 78 LS 2 / Informatik Graphalgorithmen time=11 DFS(G) 1. for each vertex uV do color[u] weiß ; p[u] nil 2. time 0 3. for each vertex uV do 4. if color[u]=weiß then DFS-Visit(u) 1 DFS-Visit(u) 1. color[u] grau 2. time time +1; d[u] time 4. for each vAdj[u] do 5. if color[v] = weiß then p[v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time 9 4 3 7 2 6 11 8 v 10 5 79 LS 2 / Informatik Graphalgorithmen time=11 DFS(G) 1. for each vertex uV do color[u] weiß ; p[u] nil 2. time 0 3. for each vertex uV do 4. if color[u]=weiß then DFS-Visit(u) 1 DFS-Visit(u) 1. color[u] grau 2. time time +1; d[u] time 4. for each vAdj[u] do 5. if color[v] = weiß then p[v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time 9 4 3 7 2 6 11 8 10 5 80 LS 2 / Informatik Graphalgorithmen time=12 DFS(G) 1. for each vertex uV do color[u] weiß ; p[u] nil 2. time 0 3. for each vertex uV do 12 4. if color[u]=weiß then DFS-Visit(u) 1 DFS-Visit(u) 1. color[u] grau 2. time time +1; d[u] time 4. for each vAdj[u] do 5. if color[v] = weiß then p[v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time 9 4 3 7 2 6 11 8 10 5 81 LS 2 / Informatik Graphalgorithmen time=12 DFS(G) 1. for each vertex uV do color[u] weiß ; p[u] nil 2. time 0 3. for each vertex uV do 12 4. if color[u]=weiß then DFS-Visit(u) 1 DFS-Visit(u) 1. color[u] grau 2. time time +1; d[u] time 4. for each vAdj[u] do 5. if color[v] = weiß then p[v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time 9 4 3 7 2 6 11 8 10 5 Laufzeit: O(|V|+|E|) 82 LS 2 / Informatik Graphalgorithmen Satz 67 (Klammersatz zur Tiefensuche): In jeder Tiefensuche eines gerichteten oder ungerichteten Graphen gilt für jeden Knoten u und v genau eine der folgenden drei Bedingungen: Die Intervalle [d[u],f[u]] und [d[v],f[v]] sind vollständig disjunkt Intervall [d[u],f[u]] ist vollständig im Interval [d[v],f[v]] enthalten und u ist Nachfolger von v im DFS-Baum Intervall [d[v],f[v]] ist vollständig im Interval [d[u],f[u]] enthalten und v ist Nachfolger von u im DFS-Baum 83 LS 2 / Informatik Graphalgorithmen Beispiel a 12 1 b 9 c 9 10 11 2 8 5 6 7 3 7 f 6 a 1 f e 2 12 d e 3 4 b 4 11 8 c d 10 5 84 LS 2 / Informatik Graphalgorithmen Beweis Fall 1: d[u] < d[v]. 85 LS 2 / Informatik Graphalgorithmen Beweis Fall 1: d[u] < d[v]. (a) d[v] < f[u]: v wurde entdeckt als u noch grau war. 86 LS 2 / Informatik Graphalgorithmen Beweis Fall 1: d[u] < d[v]. (a) d[v] < f[u]: v wurde entdeckt als u noch grau war. v Nachfolger von u 87 LS 2 / Informatik Graphalgorithmen Beweis Fall 1: d[u] < d[v]. (a) d[v] < f[u]: v wurde entdeckt als u noch grau war. v Nachfolger von u Da v nach u entdeckt wurde, werden alle seine ausgehenden Kanten entdeckt und wird v abgearbeitet bevor die Suche zu u zurückkehrt und u abarbeitet 88 LS 2 / Informatik Graphalgorithmen Beweis Fall 1: d[u] < d[v]. (a) d[v] < f[u]: v wurde entdeckt als u noch grau war. v Nachfolger von u Da v nach u entdeckt wurde, werden alle seine ausgehenden Kanten entdeckt und wird v abgearbeitet bevor die Suche zu u zurückkehrt und u abarbeitet Daher ist [d[v],f[v]] ist in [d[u],f[u]] enthalten 89 LS 2 / Informatik Graphalgorithmen Beweis Fall 1: d[u] < d[v]. (a) d[v] < f[u]: v wurde entdeckt als u noch grau war. v Nachfolger von u Da v nach u entdeckt wurde, werden alle seine ausgehenden Kanten entdeckt und wird v abgearbeitet bevor die Suche zu u zurückkehrt und u abarbeitet Daher ist [d[v],f[v]] ist in [d[u],f[u]] enthalten (b) f[u] < d[v]: Dann sind die Intervalle disjunkt 90 LS 2 / Informatik Graphalgorithmen Beweis Fall 1: d[u] < d[v]. (a) d[v] < f[u]: v wurde entdeckt als u noch grau war. v Nachfolger von u Da v nach u entdeckt wurde, werden alle seine ausgehenden Kanten entdeckt und wird v abgearbeitet bevor die Suche zu u zurückkehrt und u abarbeitet Daher ist [d[v],f[v]] ist in [d[u],f[u]] enthalten (b) f[u] < d[v]: Dann sind die Intervalle disjunkt Fall 2: analog 91 LS 2 / Informatik Graphalgorithmen Beweis Fall 1: d[u] < d[v]. (a) d[v] < f[u]: v wurde entdeckt als u noch grau war. v Nachfolger von u Da v nach u entdeckt wurde, werden alle seine ausgehenden Kanten entdeckt und wird v abgearbeitet bevor die Suche zu u zurückkehrt und u abarbeitet Daher ist [d[v],f[v]] ist in [d[u],f[u]] enthalten (b) f[u] < d[v]: Dann sind die Intervalle disjunkt Fall 2: analog 92 LS 2 / Informatik Graphalgorithmen Beispiel a 12 1 b 9 c 9 10 11 2 8 5 6 Korollar 68 7 3 7 f 6 a 1 f e 2 12 d e 3 4 b 4 11 8 c d 10 5 Knoten v ist echter Nachfolger von Knoten u im DFS-Baum von G, gdw. d[u]<d[v]<f[v]<f[u]. 93 LS 2 / Informatik Graphalgorithmen Satz 69 (Satz vom weißen Weg) In einem DFS-Wald eines gerichteten oder ungerichteten Graph G ist Knoten v ein Nachfolger von Knoten u, gdw. Zum Zeitpunkt d[u] v über einen Pfad weißer Knoten erreicht werden kann. u 2 v 1 94 LS 2 / Informatik Graphalgorithmen Satz 69 (Satz vom weißen Weg) In einem DFS-Wald eines gerichteten oder ungerichteten Graph G ist Knoten v ein Nachfolger von Knoten u, gdw. Zum Zeitpunkt d[u] v über einen Pfad weißer Knoten erreicht werden kann. Beweis „“ Annahme: v Nachfolger von u im DFS Wald • Sei w beliebiger Knoten auf Pfad im DFS Baum von u nach v • Damit ist w Nachfolger von u • Nach Korollar 68: d[u] < d[w]. Somit ist w weiss 95 LS 2 / Informatik Graphalgorithmen Satz 69 (Satz vom weißen Weg) In einem DFS-Wald eines gerichteten oder ungerichteten Graph G ist Knoten v ein Nachfolger von Knoten u, gdw. Zum Zeitpunkt d[u] v über einen Pfad weißer Knoten erreicht werden kann. Beweis „“ Annahme: v ist erreichbar von u über Pfad aus weißen Knoten zum Zeitpunkt d[u], aber v wird nicht Nachfolger von u im DFS Wald 96 LS 2 / Informatik Graphalgorithmen Satz 69 (Satz vom weißen Weg) In einem DFS-Wald eines gerichteten oder ungerichteten Graph G ist Knoten v ein Nachfolger von Knoten u, gdw. Zum Zeitpunkt d[u] v über einen Pfad weißer Knoten erreicht werden kann. Beweis „“ Annahme: v ist erreichbar von u über Pfad aus weißen Knoten zum Zeitpunkt d[u], aber v wird nicht Nachfolger von u im DFS Wald • ObdA. sei v der einzige Knoten auf Pfad, der nicht Nachfolger wird 97 LS 2 / Informatik Graphalgorithmen Satz 69 (Satz vom weißen Weg) In einem DFS-Wald eines gerichteten oder ungerichteten Graph G ist Knoten v ein Nachfolger von Knoten u, gdw. Zum Zeitpunkt d[u] v über einen Pfad weißer Knoten erreicht werden kann. Beweis „“ Annahme: v ist erreichbar von u über Pfad aus weißen Knoten zum Zeitpunkt d[u], aber v wird nicht Nachfolger von u im DFS Wald • ObdA. sei v der einzige Knoten auf Pfad, der nicht Nachfolger wird • Sei w der Vorgänger von v auf dem Pfad und sei w Nachfolger von u 98 LS 2 / Informatik Graphalgorithmen Satz 69 (Satz vom weißen Weg) In einem DFS-Wald eines gerichteten oder ungerichteten Graph G ist Knoten v ein Nachfolger von Knoten u, gdw. Zum Zeitpunkt d[u] v über einen Pfad weißer Knoten erreicht werden kann. Beweis „“ Annahme: v ist erreichbar von u über Pfad aus weißen Knoten zum Zeitpunkt d[u], aber v wird nicht Nachfolger von u im DFS Wald • ObdA. sei v der einzige Knoten auf Pfad, der nicht Nachfolger wird • Sei w der Vorgänger von v auf dem Pfad und sei w Nachfolger von u • Korollar 68: f[w]≤f[u] 99 LS 2 / Informatik Graphalgorithmen Satz 69 (Satz vom weißen Weg) In einem DFS-Wald eines gerichteten oder ungerichteten Graph G ist Knoten v ein Nachfolger von Knoten u, gdw. Zum Zeitpunkt d[u] v über einen Pfad weißer Knoten erreicht werden kann. Beweis „“ Annahme: v ist erreichbar von u über Pfad aus weißen Knoten zum Zeitpunkt d[u], aber v wird nicht Nachfolger von u im DFS Wald • ObdA. sei v der einzige Knoten auf Pfad, der nicht Nachfolger wird • Sei w der Vorgänger von v auf dem Pfad und sei w Nachfolger von u • Korollar 68: f[w]≤f[u] • v muss entdeckt werden nachdem u entdeckt wurde und bevor w abgearbeitete ist, d.h. d[u]<d[v]<f[w]≤f[u] 100 LS 2 / Informatik Graphalgorithmen Satz 69 (Satz vom weißen Weg) In einem DFS-Wald eines gerichteten oder ungerichteten Graph G ist Knoten v ein Nachfolger von Knoten u, gdw. Zum Zeitpunkt d[u] v über einen Pfad weißer Knoten erreicht werden kann. Beweis „“ Annahme: v ist erreichbar von u über Pfad aus weißen Knoten zum Zeitpunkt d[u], aber v wird nicht Nachfolger von u im DFS Wald • ObdA. sei v der einzige Knoten auf Pfad, der nicht Nachfolger wird • Sei w der Vorgänger von v auf dem Pfad und sei w Nachfolger von u • Korollar 68: f[w]≤f[u] • v muss entdeckt werden nachdem u entdeckt wurde und bevor w abgearbeitete ist, d.h. d[u]<d[v]<f[w]≤f[u] • Somit ist [d[v],f[v]] in [d[u],f[u]] enthalten (Satz 67) und nach Korollar 68 ist 101 v Nachfolger von u LS 2 / Informatik Graphalgorithmen Satz 69 (Satz vom weißen Weg) In einem DFS-Wald eines gerichteten oder ungerichteten Graph G ist Knoten v ein Nachfolger von Knoten u, gdw. Zum Zeitpunkt d[u] v über einen Pfad weißer Knoten erreicht werden kann. Beweis „“ Annahme: v ist erreichbar von u über Pfad aus weißen Knoten zum Zeitpunkt d[u], aber v wird nicht Nachfolger von u im DFS Wald • ObdA. sei v der einzige Knoten auf Pfad, der nicht Nachfolger wird • Sei w der Vorgänger von v auf dem Pfad und sei w Nachfolger von u • Korollar 68: f[w]≤f[u] • v muss entdeckt werden nachdem u entdeckt wurde und bevor w abgearbeitete ist, d.h. d[u]<d[v]<f[w]≤f[u] • Somit ist [d[v],f[v]] in [d[u],f[u]] enthalten (Satz 67) und nach Korollar 68 ist 102 v Nachfolger von u LS 2 / Informatik Graphalgorithmen Klassifikation von Kanten Baumkanten sind Kanten des DFS-Walds G Rückwartskanten sind Kanten (u,v), die Knoten u mit Vorgängern von u im DFS-Baum verbinden Vorwärtskanten sind die nicht-Baum Kanten (u,v), die u mit einem Nachfolger v in einem DFS-Baum verbindenRückwärtskante Kreuzungskanten sind alle übrigen Kanten 4 9 e b 3 7 2 12 6 a 1 8 11 c d 103 LS 2 / Informatik Graphalgorithmen Klassifikation von Kanten Baumkanten sind Kanten des DFS-Walds G Rückwartskanten sind Kanten (u,v), die Knoten u mit Vorgängern von u im DFS-Baum verbinden Vorwärtskanten sind die nicht-Baum Kanten (u,v), die u mit einem Nachfolger v in einem DFS-Baum verbinden Kreuzungskanten sind alle übrigen Kanten 4 Vorwärtskante9 e b 3 7 2 12 6 a 1 8 11 c d 104 5 10 LS 2 / Informatik Graphalgorithmen Klassifikation von Kanten Baumkanten sind Kanten des DFS-Walds G Rückwartskanten sind Kanten (u,v), die Knoten u mit Vorgängern von u im DFS-Baum verbinden Vorwärtskanten sind die nicht-Baum Kanten (u,v), die u mit einem Nachfolger v in einem DFS-Baum verbinden Kreuzungskanten sind alle übrigen Kanten 4 9 e b Kreuzungskante 3 7 2 12 6 a 1 8 11 c d 105 5 10 LS 2 / Informatik Graphalgorithmen Problem Eingabe: Schaltkreis (ohne Zyklen) mit NOT, AND, OR, XOR Gattern, n Eingänge und m Ausgänge sowie eine Belegung der Eingänge durch boolesche Werte Ausgabe: Die Ausgabewerte des Schaltkreises bei dieser Belegung Bemerkung Wir nehmen an, dass der Schaltkreis als gerichteter Graph gegeben ist. Jeder Knoten entspricht einem Gatter. 106 LS 2 / Informatik Graphalgorithmen Beispiel o1 XOR AND x1 x2 AND x3 x4 107 LS 2 / Informatik Graphalgorithmen Beispiel: Eingabe: 1,1,0,1 o1 XOR AND AND x1 x2 x3 x4 1 1 0 1 108 LS 2 / Informatik Graphalgorithmen Beispiel: Eingabe: 1,1,0,1 o1 XOR AND 1 AND x1 x2 x3 x4 1 1 0 1 109 LS 2 / Informatik Graphalgorithmen Beispiel: Eingabe: 1,1,0,1 o1 Kann XOR noch nicht auswerten! XOR AND 1 AND x1 x2 x3 x4 1 1 0 1 110 LS 2 / Informatik Graphalgorithmen Beispiel: Eingabe: 1,1,0,1 o1 XOR AND 1 AND 0 x1 x2 x3 x4 1 1 0 1 111 LS 2 / Informatik Graphalgorithmen Beispiel: Eingabe: 1,1,0,1 o1 XOR 1 AND 1 AND 0 x1 x2 x3 x4 1 1 0 1 112 LS 2 / Informatik Graphalgorithmen Beispiel: Eingabe: 1,1,0,1 o1 1 XOR 1 AND 1 AND 0 x1 x2 x3 x4 1 1 0 1 113 LS 2 / Informatik Graphalgorithmen Frage Wie kann man eine Reihenfolge der Knoten berechnen, so dass man an jedem Knoten sofort den Wert des Gatters ausrechnen kann? Eine Möglichkeit Topologisches Sortieren Sortierung eines gerichteten, kreisfreien Graphen, so dass für jede Kante (u,v) u in der Sortierung vor v steht („u wird vor v ausgewertet“) 114 LS 2 / Informatik Graphalgorithmen Topsort(G) 1. Rufe DFS(G) auf, um Zeitstempel f[v] für jeden Knoten v zu berechnen 2. Sobald ein Knoten abgearbeitet ist, füge ihn zu Beginn einer Liste L ein (absteigende Sortierung nach f[v]-Werten) 3. return L Sortierung im Beispiel 9 a, c, b, d, f, e b 4 e 3 7 2 12 f 6 a 1 11 8 c d 10 5 115 LS 2 / Informatik Graphalgorithmen Topsort(G) 1. Rufe DFS(G) auf, um Zeitstempel f[v] für jeden Knoten v zu berechnen 2. Sobald ein Knoten abgearbeitet ist, füge ihn zu Beginn einer Liste L ein (absteigende Sortierung nach f[v]-Werten) 3. return L Sortierung im Beispiel a, c, b, d, f, e Laufzeit 9 O(|V|+|E|) b 4 e 3 7 2 12 f 6 a 1 11 8 c d 10 5 116 LS 2 / Informatik Graphalgorithmen Lemma 70 Ein gerichteter Graph G ist azyklisch, gdw. Eine Tiefensuche in G keine Rückwärtskanten hat. Beweis „“: Annahme: Es gibt Rückwärtskante (u,v). Dann ist v Vorgänger von u im DFS Wald. Es gibt also einen Weg von v nach u und die Rückwärtskante schließt den Kreis. 117 LS 2 / Informatik Graphalgorithmen Lemma 70 Ein gerichteter Graph G ist azyklisch, gdw. Eine Tiefensuche in G keine Rückwärtskanten hat. Beweis „“: Annahme: Es gibt Rückwärtskante (u,v). Dann ist v Vorgänger von u im DFS Wald. Es gibt also einen Weg von v nach u und die Rückwärtskante schließt den Kreis. „“: Annahme: G enthält Kreis C. Sei v der erste Knoten aus c, der entdeckt wurde und sei (u,v) die vorhergehende Kante im Kreis C. Zum Zeitpunkt d[v] gibt es einen weißen Pfad von v nach u. Nach Satz 67 wird u Nachfolger von v und (u,v) somit Rückwärtskante. 118 LS 2 / Informatik Graphalgorithmen Lemma 70 Ein gerichteter Graph G ist azyklisch, gdw. Eine Tiefensuche in G keine Rückwärtskanten hat. Beweis „“: Annahme: Es gibt Rückwärtskante (u,v). Dann ist v Vorgänger von u im DFS Wald. Es gibt also einen Weg von v nach u und die Rückwärtskante schließt den Kreis. „“: Annahme: G enthält Kreis C. Sei v der erste Knoten aus c, der entdeckt wurde und sei (u,v) die vorhergehende Kante im Kreis C. Zum Zeitpunkt d[v] gibt es einen weißen Pfad von v nach u. Nach Satz 67 wird u Nachfolger von v und (u,v) somit Rückwärtskante. 119 LS 2 / Informatik Graphalgorithmen Satz 71 TopSort(G) berechnet eine topologische Sortierung eines gerichteten azyklischen Graphs. 120 LS 2 / Informatik Graphalgorithmen Satz 71 TopSort(G) berechnet eine topologische Sortierung eines gerichteten azyklischen Graphs. Beweis • Annahme: Wir führen DFS auf gerichtetem Graph aus, um die Abarbeitungszeitpunkte zu bestimmen. 121 LS 2 / Informatik Graphalgorithmen Satz 71 TopSort(G) berechnet eine topologische Sortierung eines gerichteten azyklischen Graphs. Beweis • • Annahme: Wir führen DFS auf gerichtetem Graph aus, um die Abarbeitungszeitpunkte zu bestimmen. Z.Z.: Für jedes Paar von Knoten u,vV mit uv gilt: Gibt es Kante von u nach v, so ist f[v] < f[u]. 122 LS 2 / Informatik Graphalgorithmen Satz 71 TopSort(G) berechnet eine topologische Sortierung eines gerichteten azyklischen Graphs. Beweis • • • Annahme: Wir führen DFS auf gerichtetem Graph aus, um die Abarbeitungszeitpunkte zu bestimmen. Z.Z.: Für jedes Paar von Knoten u,vV mit uv gilt: Gibt es Kante von u nach v, so ist f[v] < f[u]. Betrachte Zeitpunkt, wenn eine beliebige Kante (u,v) durch Tiefensuche entdeckt wird. Dann kann v nicht grau sein, denn dann wäre (u,v) Rückwärtskante und nach Lemma 70 G nicht azyklisch. 123 LS 2 / Informatik Graphalgorithmen Satz 71 TopSort(G) berechnet eine topologische Sortierung eines gerichteten azyklischen Graphs. Beweis • • • • Annahme: Wir führen DFS auf gerichtetem Graph aus, um die Abarbeitungszeitpunkte zu bestimmen. Z.Z.: Für jedes Paar von Knoten u,vV mit uv gilt: Gibt es Kante von u nach v, so ist f[v] < f[u]. Betrachte Zeitpunkt, wenn eine beliebige Kante (u,v) durch Tiefensuche entdeckt wird. Dann kann v nicht grau sein, denn dann wäre (u,v) Rückwärtskante und nach Lemma 70 G nicht azyklisch. Daher ist v entweder weiß oder schwarz. 124 LS 2 / Informatik Graphalgorithmen Satz 71 TopSort(G) berechnet eine topologische Sortierung eines gerichteten azyklischen Graphs. Beweis • • • • • Annahme: Wir führen DFS auf gerichtetem Graph aus, um die Abarbeitungszeitpunkte zu bestimmen. Z.Z.: Für jedes Paar von Knoten u,vV mit uv gilt: Gibt es Kante von u nach v, so ist f[v] < f[u]. Betrachte Zeitpunkt, wenn eine beliebige Kante (u,v) durch Tiefensuche entdeckt wird. Dann kann v nicht grau sein, denn dann wäre (u,v) Rückwärtskante und nach Lemma 70 G nicht azyklisch. Daher ist v entweder weiß oder schwarz. Ist v weiß, so wird v Nachfolger von u und es gilt f[v] < f[u] 125 LS 2 / Informatik Graphalgorithmen Satz 71 TopSort(G) berechnet eine topologische Sortierung eines gerichteten azyklischen Graphs. Beweis • • • • • • Annahme: Wir führen DFS auf gerichtetem Graph aus, um die Abarbeitungszeitpunkte zu bestimmen. Z.Z.: Für jedes Paar von Knoten u,vV mit uv gilt: Gibt es Kante von u nach v, so ist f[v] < f[u]. Betrachte Zeitpunkt, wenn eine beliebige Kante (u,v) durch Tiefensuche entdeckt wird. Dann kann v nicht grau sein, denn dann wäre (u,v) Rückwärtskante und nach Lemma 70 G nicht azyklisch. Daher ist v entweder weiß oder schwarz. Ist v weiß, so wird v Nachfolger von u und es gilt f[v] < f[u] Ist v schwarz, dann gilt erst recht f[v] < f[u]. Damit folgt der Satz. 126 LS 2 / Informatik Graphalgorithmen Satz 71 TopSort(G) berechnet eine topologische Sortierung eines gerichteten azyklischen Graphs. Beweis • • • • • • Annahme: Wir führen DFS auf gerichtetem Graph aus, um die Abarbeitungszeitpunkte zu bestimmen. Z.Z.: Für jedes Paar von Knoten u,vV mit uv gilt: Gibt es Kante von u nach v, so ist f[v] < f[u]. Betrachte Zeitpunkt, wenn eine beliebige Kante (u,v) durch Tiefensuche entdeckt wird. Dann kann v nicht grau sein, denn dann wäre (u,v) Rückwärtskante und nach Lemma 70 G nicht azyklisch. Daher ist v entweder weiß oder schwarz. Ist v weiß, so wird v Nachfolger von u und es gilt f[v] < f[u] Ist v schwarz, dann gilt erst recht f[v] < f[u]. Damit folgt der Satz. 127