Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

LS 2 / Informatik Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

Ähnliche Präsentationen


Präsentation zum Thema: "LS 2 / Informatik Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)"—  Präsentation transkript:

1 LS 2 / Informatik Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

2 LS 2 / Informatik 2 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*

3 LS 2 / Informatik 3 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?

4 LS 2 / Informatik 4 Graphalgorithmen Graphen und Matrixmultiplikation Sei A die n n-Adjazenzmatrix eines ungerichteten Graphen G mit Knotenmenge {1,…,n} Was ist A A?

5 LS 2 / Informatik 5 Graphalgorithmen Behauptung 62 Sei Z= A A. Dann gilt z >0, g.d.w. es in G einen Pfad der Länge 2 von Knoten i zu Knoten j gibt. ij

6 LS 2 / Informatik 6 Graphalgorithmen Behauptung 63 Sei Z= A A + A. Dann gilt, dass z >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: b =1 z >0 ij

7 LS 2 / Informatik 7 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.

8 LS 2 / Informatik 8 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.

9 LS 2 / Informatik 9 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.

10 LS 2 / Informatik 10 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.

11 LS 2 / Informatik 11 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.

12 LS 2 / Informatik 12 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 13 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.

14 LS 2 / Informatik 14 Graphalgorithmen Konsequenz aus Beh. 64 und 65 Wenn wir die Berechnung von B log n mal iterieren, haben wir die transitive Hülle berechnet 3/2

15 LS 2 / Informatik 15 Graphalgorithmen TransitiveHülle(A) 1. for i 1 to log n do 2. Z A A+A 3. for i 1 to n do 4. for j 1 to n do 5. if z >0 then b 1 else b 0 6. A B 7. return A 3/2 ij

16 LS 2 / Informatik 16 Graphalgorithmen TransitiveHülle(A) Laufzeit 1. for i 1 to log n do O(log n) 2. Z A A+A O(M(n) log n) 3. for i 1 to n do O(n log n) 4. for j 1 to n do O(n² log n) 5. if z >0 then b 1 else b 0 O(n² log n) 6. A B O(n² log n) 7. return A O(1) M(n): Zeit um zwei n n-Matrizen zu multiplizieren 3/2 ij

17 LS 2 / Informatik 17 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 n n-Matrizen bezeichnet.

18 LS 2 / Informatik 18 Noch ein Graphtraversierungsalgorithmus Graphalgorithmen

19 LS 2 / Informatik 19 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|) Graphalgorithmen

20 LS 2 / Informatik 20 Breitensuche Graphalgorithmen s

21 LS 2 / Informatik 21 Breitensuche Graphalgorithmen s 0

22 LS 2 / Informatik 22 Breitensuche Graphalgorithmen s 0 1

23 LS 2 / Informatik 23 Breitensuche Graphalgorithmen s 0 1 1

24 LS 2 / Informatik 24 Breitensuche Graphalgorithmen s

25 LS 2 / Informatik 25 Breitensuche Graphalgorithmen s

26 LS 2 / Informatik 26 Breitensuche Graphalgorithmen s

27 LS 2 / Informatik 27 Breitensuche Graphalgorithmen s v [v] Vorgängergraph G enthält alle Kanten ( [v],v). Vorgängergraph G enthält alle Kanten ( [v],v).

28 LS 2 / Informatik 28 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 Graphalgorithmen

29 LS 2 / Informatik 29 Tiefensuche Graphalgorithmen s

30 LS 2 / Informatik 30 Tiefensuche Graphalgorithmen s

31 LS 2 / Informatik 31 Tiefensuche Graphalgorithmen s

32 LS 2 / Informatik 32 Tiefensuche Graphalgorithmen s

33 LS 2 / Informatik 33 Tiefensuche Graphalgorithmen s

34 LS 2 / Informatik 34 Tiefensuche Graphalgorithmen s

35 LS 2 / Informatik 35 Tiefensuche Graphalgorithmen s

36 LS 2 / Informatik 36 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 Graphalgorithmen

37 LS 2 / Informatik 37 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 Graphalgorithmen

38 LS 2 / Informatik 38 DFS(G) 1. for each vertex u V do color[u] weiß ; [u] nil 2. time 0 3. for each vertex u V 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 v Adj[u] do 5. if color[v] = weiß then [v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time Graphalgorithmen

39 LS 2 / Informatik 39 DFS(G) 1. for each vertex u V do color[u] weiß ; [u] nil 2. time 0 3. for each vertex u V 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 v Adj[u] do 5. if color[v] = weiß then [v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time Graphalgorithmen

40 LS 2 / Informatik 40 DFS(G) 1. for each vertex u V do color[u] weiß ; [u] nil 2. time 0 3. for each vertex u V 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 v Adj[u] do 5. if color[v] = weiß then [v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time Graphalgorithmen time=0

41 LS 2 / Informatik 41 DFS(G) 1. for each vertex u V do color[u] weiß ; [u] nil 2. time 0 3. for each vertex u V 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 v Adj[u] do 5. if color[v] = weiß then [v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time Graphalgorithmen time=0 u

42 LS 2 / Informatik 42 DFS(G) 1. for each vertex u V do color[u] weiß ; [u] nil 2. time 0 3. for each vertex u V 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 v Adj[u] do 5. if color[v] = weiß then [v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time Graphalgorithmen time=0 u

43 LS 2 / Informatik 43 DFS(G) 1. for each vertex u V do color[u] weiß ; [u] nil 2. time 0 3. for each vertex u V 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 v Adj[u] do 5. if color[v] = weiß then [v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time Graphalgorithmen u time=0

44 LS 2 / Informatik 44 DFS(G) 1. for each vertex u V do color[u] weiß ; [u] nil 2. time 0 3. for each vertex u V 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 v Adj[u] do 5. if color[v] = weiß then [v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time Graphalgorithmen u 1 time=1

45 LS 2 / Informatik 45 DFS(G) 1. for each vertex u V do color[u] weiß ; [u] nil 2. time 0 3. for each vertex u V 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 v Adj[u] do 5. if color[v] = weiß then [v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time Graphalgorithmen u 1 v time=1

46 LS 2 / Informatik 46 DFS(G) 1. for each vertex u V do color[u] weiß ; [u] nil 2. time 0 3. for each vertex u V 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 v Adj[u] do 5. if color[v] = weiß then [v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time Graphalgorithmen u 1 v time=1

47 LS 2 / Informatik 47 DFS(G) 1. for each vertex u V do color[u] weiß ; [u] nil 2. time 0 3. for each vertex u V 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 v Adj[u] do 5. if color[v] = weiß then [v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time Graphalgorithmen time=1 1 u

48 LS 2 / Informatik 48 DFS(G) 1. for each vertex u V do color[u] weiß ; [u] nil 2. time 0 3. for each vertex u V 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 v Adj[u] do 5. if color[v] = weiß then [v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time Graphalgorithmen time=2 1 u 2

49 LS 2 / Informatik 49 DFS(G) 1. for each vertex u V do color[u] weiß ; [u] nil 2. time 0 3. for each vertex u V 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 v Adj[u] do 5. if color[v] = weiß then [v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time Graphalgorithmen 1 u 2 v time=2

50 LS 2 / Informatik 50 DFS(G) 1. for each vertex u V do color[u] weiß ; [u] nil 2. time 0 3. for each vertex u V 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 v Adj[u] do 5. if color[v] = weiß then [v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time Graphalgorithmen 1 u 2 time=2

51 LS 2 / Informatik 51 DFS(G) 1. for each vertex u V do color[u] weiß ; [u] nil 2. time 0 3. for each vertex u V 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 v Adj[u] do 5. if color[v] = weiß then [v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time Graphalgorithmen 1 2 u time=2

52 LS 2 / Informatik 52 DFS(G) 1. for each vertex u V do color[u] weiß ; [u] nil 2. time 0 3. for each vertex u V 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 v Adj[u] do 5. if color[v] = weiß then [v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time Graphalgorithmen time=3 1 2 u 3

53 LS 2 / Informatik 53 DFS(G) 1. for each vertex u V do color[u] weiß ; [u] nil 2. time 0 3. for each vertex u V 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 v Adj[u] do 5. if color[v] = weiß then [v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time Graphalgorithmen 1 2 u 3 time=3

54 LS 2 / Informatik 54 DFS(G) 1. for each vertex u V do color[u] weiß ; [u] nil 2. time 0 3. for each vertex u V 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 v Adj[u] do 5. if color[v] = weiß then [v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time Graphalgorithmen 1 2 u 3 time=3

55 LS 2 / Informatik 55 DFS(G) 1. for each vertex u V do color[u] weiß ; [u] nil 2. time 0 3. for each vertex u V 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 v Adj[u] do 5. if color[v] = weiß then [v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time Graphalgorithmen time=4

56 LS 2 / Informatik 56 DFS(G) 1. for each vertex u V do color[u] weiß ; [u] nil 2. time 0 3. for each vertex u V 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 v Adj[u] do 5. if color[v] = weiß then [v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time Graphalgorithmen u v time=4

57 LS 2 / Informatik 57 DFS(G) 1. for each vertex u V do color[u] weiß ; [u] nil 2. time 0 3. for each vertex u V 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 v Adj[u] do 5. if color[v] = weiß then [v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time Graphalgorithmen u v time=4 4

58 LS 2 / Informatik 58 DFS(G) 1. for each vertex u V do color[u] weiß ; [u] nil 2. time 0 3. for each vertex u V 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 v Adj[u] do 5. if color[v] = weiß then [v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time Graphalgorithmen u time=4

59 LS 2 / Informatik 59 DFS(G) 1. for each vertex u V do color[u] weiß ; [u] nil 2. time 0 3. for each vertex u V 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 v Adj[u] do 5. if color[v] = weiß then [v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time Graphalgorithmen u 5 time=5

60 LS 2 / Informatik 60 DFS(G) 1. for each vertex u V do color[u] weiß ; [u] nil 2. time 0 3. for each vertex u V 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 v Adj[u] do 5. if color[v] = weiß then [v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time Graphalgorithmen u 5 v time=5

61 LS 2 / Informatik 61 DFS(G) 1. for each vertex u V do color[u] weiß ; [u] nil 2. time 0 3. for each vertex u V 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 v Adj[u] do 5. if color[v] = weiß then [v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time Graphalgorithmen u 5 v time=5

62 LS 2 / Informatik 62 DFS(G) 1. for each vertex u V do color[u] weiß ; [u] nil 2. time 0 3. for each vertex u V 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 v Adj[u] do 5. if color[v] = weiß then [v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time Graphalgorithmen u 5 v time=5

63 LS 2 / Informatik 63 DFS(G) 1. for each vertex u V do color[u] weiß ; [u] nil 2. time 0 3. for each vertex u V 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 v Adj[u] do 5. if color[v] = weiß then [v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time Graphalgorithmen u 6 time=6

64 LS 2 / Informatik 64 DFS(G) 1. for each vertex u V do color[u] weiß ; [u] nil 2. time 0 3. for each vertex u V 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 v Adj[u] do 5. if color[v] = weiß then [v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time Graphalgorithmen u 6 v time=6

65 LS 2 / Informatik 65 DFS(G) 1. for each vertex u V do color[u] weiß ; [u] nil 2. time 0 3. for each vertex u V 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 v Adj[u] do 5. if color[v] = weiß then [v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time Graphalgorithmen v time=7

66 LS 2 / Informatik 66 DFS(G) 1. for each vertex u V do color[u] weiß ; [u] nil 2. time 0 3. for each vertex u V 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 v Adj[u] do 5. if color[v] = weiß then [v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time Graphalgorithmen u time=7

67 LS 2 / Informatik 67 DFS(G) 1. for each vertex u V do color[u] weiß ; [u] nil 2. time 0 3. for each vertex u V 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 v Adj[u] do 5. if color[v] = weiß then [v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time Graphalgorithmen time=8

68 LS 2 / Informatik 68 DFS(G) 1. for each vertex u V do color[u] weiß ; [u] nil 2. time 0 3. for each vertex u V 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 v Adj[u] do 5. if color[v] = weiß then [v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time Graphalgorithmen u time=8

69 LS 2 / Informatik 69 DFS(G) 1. for each vertex u V do color[u] weiß ; [u] nil 2. time 0 3. for each vertex u V 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 v Adj[u] do 5. if color[v] = weiß then [v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time Graphalgorithmen time=9

70 LS 2 / Informatik 70 DFS(G) 1. for each vertex u V do color[u] weiß ; [u] nil 2. time 0 3. for each vertex u V 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 v Adj[u] do 5. if color[v] = weiß then [v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time Graphalgorithmen u v time=9

71 LS 2 / Informatik 71 DFS(G) 1. for each vertex u V do color[u] weiß ; [u] nil 2. time 0 3. for each vertex u V 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 v Adj[u] do 5. if color[v] = weiß then [v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time Graphalgorithmen u v time=9

72 LS 2 / Informatik 72 DFS(G) 1. for each vertex u V do color[u] weiß ; [u] nil 2. time 0 3. for each vertex u V 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 v Adj[u] do 5. if color[v] = weiß then [v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time Graphalgorithmen u time=9

73 LS 2 / Informatik 73 DFS(G) 1. for each vertex u V do color[u] weiß ; [u] nil 2. time 0 3. for each vertex u V 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 v Adj[u] do 5. if color[v] = weiß then [v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time Graphalgorithmen u 10 time=10

74 LS 2 / Informatik 74 DFS(G) 1. for each vertex u V do color[u] weiß ; [u] nil 2. time 0 3. for each vertex u V 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 v Adj[u] do 5. if color[v] = weiß then [v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time Graphalgorithmen u 10 v time=10

75 LS 2 / Informatik 75 DFS(G) 1. for each vertex u V do color[u] weiß ; [u] nil 2. time 0 3. for each vertex u V 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 v Adj[u] do 5. if color[v] = weiß then [v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time Graphalgorithmen u 10 v time=10

76 LS 2 / Informatik 76 DFS(G) 1. for each vertex u V do color[u] weiß ; [u] nil 2. time 0 3. for each vertex u V 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 v Adj[u] do 5. if color[v] = weiß then [v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time Graphalgorithmen u 10 v time=10

77 LS 2 / Informatik 77 DFS(G) 1. for each vertex u V do color[u] weiß ; [u] nil 2. time 0 3. for each vertex u V 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 v Adj[u] do 5. if color[v] = weiß then [v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time Graphalgorithmen u 10 v time=10

78 LS 2 / Informatik 78 DFS(G) 1. for each vertex u V do color[u] weiß ; [u] nil 2. time 0 3. for each vertex u V 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 v Adj[u] do 5. if color[v] = weiß then [v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time Graphalgorithmen u 10 v time=10

79 LS 2 / Informatik 79 DFS(G) 1. for each vertex u V do color[u] weiß ; [u] nil 2. time 0 3. for each vertex u V 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 v Adj[u] do 5. if color[v] = weiß then [v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time Graphalgorithmen v 11 time=11

80 LS 2 / Informatik 80 DFS(G) 1. for each vertex u V do color[u] weiß ; [u] nil 2. time 0 3. for each vertex u V 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 v Adj[u] do 5. if color[v] = weiß then [v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time Graphalgorithmen time=11

81 LS 2 / Informatik 81 DFS(G) 1. for each vertex u V do color[u] weiß ; [u] nil 2. time 0 3. for each vertex u V 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 v Adj[u] do 5. if color[v] = weiß then [v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time Graphalgorithmen time=12

82 LS 2 / Informatik 82 DFS(G) 1. for each vertex u V do color[u] weiß ; [u] nil 2. time 0 3. for each vertex u V 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 v Adj[u] do 5. if color[v] = weiß then [v] u ; DFS-Visit(v) 6. color[u] schwarz 7. time time+1; f[u] time Graphalgorithmen time=12 Laufzeit: O(|V|+|E|)

83 LS 2 / Informatik 83 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 Graphalgorithmen

84 LS 2 / Informatik 84 Beispiel Graphalgorithmen a a b c d e f d f e c b

85 LS 2 / Informatik 85 Beweis Fall 1: d[u] < d[v]. Graphalgorithmen

86 LS 2 / Informatik 86 Beweis Fall 1: d[u] < d[v]. (a) d[v] < f[u]: v wurde entdeckt als u noch grau war. Graphalgorithmen

87 LS 2 / Informatik 87 Beweis Fall 1: d[u] < d[v]. (a) d[v] < f[u]: v wurde entdeckt als u noch grau war. v Nachfolger von u Graphalgorithmen

88 LS 2 / Informatik 88 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 Graphalgorithmen

89 LS 2 / Informatik 89 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 Graphalgorithmen

90 LS 2 / Informatik 90 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 Graphalgorithmen

91 LS 2 / Informatik 91 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 Graphalgorithmen

92 LS 2 / Informatik 92 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 Graphalgorithmen

93 LS 2 / Informatik 93 Beispiel Korollar 68 Knoten v ist echter Nachfolger von Knoten u im DFS-Baum von G, gdw. d[u]

94 LS 2 / Informatik 94 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. Graphalgorithmen 1 u 2 v

95 LS 2 / Informatik 95 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 Graphalgorithmen

96 LS 2 / Informatik 96 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 Graphalgorithmen

97 LS 2 / Informatik 97 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 Graphalgorithmen

98 LS 2 / Informatik 98 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 Graphalgorithmen

99 LS 2 / Informatik 99 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] Graphalgorithmen

100 LS 2 / Informatik 100 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]

101 LS 2 / Informatik 101 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]

102 LS 2 / Informatik 102 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]

103 LS 2 / Informatik 103 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 Graphalgorithmen a b c d e 4 Rückwärtskante

104 LS 2 / Informatik 104 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 Graphalgorithmen a b c d e 4 Vorwärtskante

105 LS 2 / Informatik 105 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 Graphalgorithmen a b c d e 4 Kreuzungskante

106 LS 2 / Informatik 106 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. Graphalgorithmen

107 LS 2 / Informatik 107 Beispiel Graphalgorithmen AND x XOR AND 1 x 2 x x 3 4 o 1

108 LS 2 / Informatik 108 Beispiel: Eingabe: 1,1,0,1 Graphalgorithmen AND x XOR AND 1 x 2 x x 3 4 o

109 LS 2 / Informatik 109 Beispiel: Eingabe: 1,1,0,1 Graphalgorithmen AND x XOR AND 1 x 2 x x 3 4 o

110 LS 2 / Informatik 110 Beispiel: Eingabe: 1,1,0,1 Graphalgorithmen AND x XOR AND 1 x 2 x x 3 4 o Kann XOR noch nicht auswerten!

111 LS 2 / Informatik 111 Beispiel: Eingabe: 1,1,0,1 Graphalgorithmen AND x XOR AND 1 x 2 x x 3 4 o

112 LS 2 / Informatik 112 Beispiel: Eingabe: 1,1,0,1 Graphalgorithmen AND x XOR AND 1 x 2 x x 3 4 o

113 LS 2 / Informatik 113 Beispiel: Eingabe: 1,1,0,1 Graphalgorithmen AND x XOR AND 1 x 2 x x 3 4 o

114 LS 2 / Informatik 114 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) Graphalgorithmen

115 LS 2 / Informatik 115 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 Graphalgorithmen a b c d e f 4

116 LS 2 / Informatik 116 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 O(|V|+|E|) Graphalgorithmen a b c d e f 4

117 LS 2 / Informatik 117 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. Graphalgorithmen

118 LS 2 / Informatik 118 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. Graphalgorithmen

119 LS 2 / Informatik 119 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. Graphalgorithmen

120 LS 2 / Informatik 120 Satz 71 TopSort(G) berechnet eine topologische Sortierung eines gerichteten azyklischen Graphs. Graphalgorithmen

121 LS 2 / Informatik 121 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. Graphalgorithmen

122 LS 2 / Informatik 122 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,v V mit u v gilt: Gibt es Kante von u nach v, so ist f[v] < f[u]. Graphalgorithmen

123 LS 2 / Informatik 123 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,v V mit u v 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. Graphalgorithmen

124 LS 2 / Informatik 124 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,v V mit u v 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. Graphalgorithmen

125 LS 2 / Informatik 125 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,v V mit u v 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] Graphalgorithmen

126 LS 2 / Informatik 126 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,v V mit u v 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. Graphalgorithmen

127 LS 2 / Informatik 127 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,v V mit u v 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. Graphalgorithmen


Herunterladen ppt "LS 2 / Informatik Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)"

Ähnliche Präsentationen


Google-Anzeigen