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