for each - TU Dortmund, Informatik 2

Werbung
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 nn-Adjazenzmatrix eines ungerichteten Graphen G mit
Knotenmenge {1,…,n}
Was ist AA?
4
LS 2 /
Informatik
Graphalgorithmen
Behauptung 62
Sei Z= AA. 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‘= AA + 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 i1 to log3/2 n do
2.
Z‘  A A+A
3.
for i1 to n do
4.
for j1 to n do
5.
if z ij >0 then bij 1 else bij 0
6.
AB
7. return A
15
LS 2 /
Informatik
Graphalgorithmen
TransitiveHülle(A)
1. for i1 to log3/2 n do
2.
Z‘  A A+A
3.
for i1 to n do
4.
for j1 to n do
5.
if z ij >0 then bij 1 else bij 0
6.
AB
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 nn-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
nn-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 uV do color[u]  weiß ; p[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 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 uV do color[u]  weiß ; p[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 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 uV do color[u]  weiß ; p[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 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 uV do color[u]  weiß ; p[u]  nil
2. time  0
3. for each vertex uV 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 vAdj[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 uV do color[u]  weiß ; p[u]  nil
2. time  0
3. for each vertex uV 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 vAdj[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 uV do color[u]  weiß ; p[u]  nil
2. time  0
3. for each vertex uV 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 vAdj[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 uV do color[u]  weiß ; p[u]  nil
2. time  0
3. for each vertex uV 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 vAdj[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 uV do color[u]  weiß ; p[u]  nil
2. time  0
3. for each vertex uV 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 vAdj[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 uV do color[u]  weiß ; p[u]  nil
2. time  0
3. for each vertex uV 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 vAdj[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 uV do color[u]  weiß ; p[u]  nil
2. time  0
3. for each vertex uV 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 vAdj[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 uV do color[u]  weiß ; p[u]  nil
2. time  0
3. for each vertex uV 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 vAdj[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 uV do color[u]  weiß ; p[u]  nil
2. time  0
3. for each vertex uV 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 vAdj[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 uV do color[u]  weiß ; p[u]  nil
2. time  0
3. for each vertex uV 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 vAdj[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 uV do color[u]  weiß ; p[u]  nil
2. time  0
3. for each vertex uV 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 vAdj[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 uV do color[u]  weiß ; p[u]  nil
2. time  0
3. for each vertex uV 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 vAdj[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 uV do color[u]  weiß ; p[u]  nil
2. time  0
3. for each vertex uV 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 vAdj[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 uV do color[u]  weiß ; p[u]  nil
2. time  0
3. for each vertex uV 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 vAdj[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 uV do color[u]  weiß ; p[u]  nil
2. time  0
3. for each vertex uV 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 vAdj[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 uV do color[u]  weiß ; p[u]  nil
2. time  0
3. for each vertex uV 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 vAdj[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 uV do color[u]  weiß ; p[u]  nil
2. time  0
3. for each vertex uV 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 vAdj[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 uV do color[u]  weiß ; p[u]  nil
2. time  0
3. for each vertex uV 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 vAdj[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 uV do color[u]  weiß ; p[u]  nil
2. time  0
3. for each vertex uV 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 vAdj[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 uV do color[u]  weiß ; p[u]  nil
2. time  0
3. for each vertex uV 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 vAdj[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 uV do color[u]  weiß ; p[u]  nil
2. time  0
3. for each vertex uV 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 vAdj[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 uV do color[u]  weiß ; p[u]  nil
2. time  0
3. for each vertex uV 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 vAdj[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 uV do color[u]  weiß ; p[u]  nil
2. time  0
3. for each vertex uV 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 vAdj[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 uV do color[u]  weiß ; p[u]  nil
2. time  0
3. for each vertex uV 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 vAdj[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 uV do color[u]  weiß ; p[u]  nil
2. time  0
3. for each vertex uV 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 vAdj[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 uV do color[u]  weiß ; p[u]  nil
2. time  0
3. for each vertex uV 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 vAdj[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 uV do color[u]  weiß ; p[u]  nil
2. time  0
3. for each vertex uV 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 vAdj[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 uV do color[u]  weiß ; p[u]  nil
2. time  0
3. for each vertex uV 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 vAdj[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 uV do color[u]  weiß ; p[u]  nil
2. time  0
3. for each vertex uV 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 vAdj[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 uV do color[u]  weiß ; p[u]  nil
2. time  0
3. for each vertex uV 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 vAdj[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 uV do color[u]  weiß ; p[u]  nil
2. time  0
3. for each vertex uV 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 vAdj[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 uV do color[u]  weiß ; p[u]  nil
2. time  0
3. for each vertex uV 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 vAdj[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 uV do color[u]  weiß ; p[u]  nil
2. time  0
3. for each vertex uV 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 vAdj[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 uV do color[u]  weiß ; p[u]  nil
2. time  0
3. for each vertex uV 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 vAdj[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 uV do color[u]  weiß ; p[u]  nil
2. time  0
3. for each vertex uV 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 vAdj[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 uV do color[u]  weiß ; p[u]  nil
2. time  0
3. for each vertex uV 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 vAdj[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 uV do color[u]  weiß ; p[u]  nil
2. time  0
3. for each vertex uV 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 vAdj[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 uV do color[u]  weiß ; p[u]  nil
2. time  0
3. for each vertex uV 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 vAdj[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 uV do color[u]  weiß ; p[u]  nil
2. time  0
3. for each vertex uV 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 vAdj[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 uV do color[u]  weiß ; p[u]  nil
2. time  0
3. for each vertex uV 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 vAdj[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 uV do color[u]  weiß ; p[u]  nil
2. time  0
3. for each vertex uV 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 vAdj[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 uV do color[u]  weiß ; p[u]  nil
2. time  0
3. for each vertex uV 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 vAdj[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,vV mit uv 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,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.
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,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.
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,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]
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,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.
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,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.
127
Herunterladen