3.5 Gerichteter Pfad Definition 292
Eine Folge (u
0, u
1, . . . , u
n) mit u
i∈ V f¨ ur i = 0, . . . , n heißt gerichteter Pfad, wenn
∀i ∈ {0, . . . , n − 1} h
(u
i, u
i+1) ∈ A i .
Ein gerichteter Pfad heißt einfach, falls alle u
ipaarweise verschieden sind.
Diskrete Strukturen 3.5 Gerichteter Pfad 475/571
c
Ernst W. Mayr
3.6 Gerichteter Kreis Definition 293
Ein gerichteter Pfad (u
0, u
1, . . . , u
n) heißt gerichteter Kreis, wenn u
0= u
n.
Der gerichtete Kreis heißt einfach, falls u
0, u
1, . . . , u
n−1alle paarweise verschieden sind.
3.7 dag
Definition 294
Ein Digraph, der keinen gerichteten Kreis enth¨ alt, heißt d irected acyclic g raph, kurz dag.
In einem dag heißen Knoten mit In-Grad 0 Quellen, Knoten mit Aus-Grad 0 Senken.
Eine Nummerierung i : V → {1, . . . , |V |} der Knoten eines dags heißt topologisch, falls f¨ ur jede Kante (u, v) ∈ A gilt:
i(u) < i(v).
Diskrete Strukturen 3.7 dag 477/571
c
Ernst W. Mayr
Beispiel 295
1
2
3
4
5
6 7
8
9
10
11
Algorithmus zur topologischen Nummerierung:
while V 6 =6 0 do
nummeriere eine Quelle mit der n¨ achsten Nummer streiche diese Quelle aus V
od
Diskrete Strukturen 3.7 dag 479/571
c
Ernst W. Mayr
3.8 Zusammenhang
Definition 296
Ein Digraph heißt zusammenh¨ angend, wenn der zugrundeliegende ungerichtete Graph zusammenh¨ angend ist.
3.9 Starke Zusammenhangskomponenten
Definition 297
Sei G = (V, A) ein Digraph. Man definiert eine ¨ Aquivalenzrelation R ⊆ V × V wie folgt:
uRv ⇐⇒
es gibt in G einen gerichteten Pfad von u nach v und einen gerichteten Pfad von v nach u.
Die von den ¨ Aquivalenzklassen dieser Relation induzierten
Teilgraphen heißen die starken Zusammenhangskomponenten von G.
Beispiel 298
Diskrete Strukturen 3.9 Starke Zusammenhangskomponenten 481/571
c
Ernst W. Mayr
4. Durchsuchen von Graphen
Gesucht sind Prozeduren, die alle Knoten (eventuell auch alle Kanten) mindestens einmal besuchen und m¨ oglichst effizient sind.
4.1 Tiefensuche, Depth-First-Search
Sei G = (V, E) ein ungerichteter Graph, gegeben als Adjazenzliste.
Algorithmus Tiefensuche (DFS):
while ∃ unvisited v do
r := pick (random) unvisited node push r onto stack
while stack 6= ∅ do v := pop top element if v unvisited then
mark v visited
push all neighbours of v onto stack perform operations DFS Ops(v) fi
od od
Diskrete Strukturen 4.1 Tiefensuche, Depth-First-Search 483/571
c
Ernst W. Mayr
Beispiel 299
A A
A
A @
@
@
@
A
A A
A @
@
@
@
A A
A A
U -
6
@
@
@
@ I
? * 1 g
2 g
3 g
4 g 5 g 6 g
7 g
8 g
9 g 1 t
2 t
3 t
4 t 5 t
t 6 t 7 8 t
9 t B
B B
B B
B Q
Q Q
Q Q
Q B
B B
B B
B Q
Q Q
Q Q
Q
H
H H
H
Beobachtung: Die markierten Kanten bilden einen Spannbaum:
A A
A
A @
@
@
@
A A
A
A @
@
@
@
A A
A A
U -
6
@
@
@
@ I
? * 1 g
2 g
3 g
4 g 5 g 6 g
7 g
8 g
9 g 1 t
2 t
3 t
4 t 5 t
t 6 t 7 8 t
9 t B
B B
B B
B Q
Q Q
Q Q
Q B
B B
B B
B Q
Q Q
Q Q
Q H H H H
R¨ uckw¨ artskante
9 g 8 g 6 g 7 g
5 g 4 g 3 g 2 g
1 g
@
@
s s
s s
s s s s s
Diskrete Strukturen 4.1 Tiefensuche, Depth-First-Search 485/571
c
Ernst W. Mayr
Folge der Stackzust¨ ande
1 2
8 7
3 9 8 1 8 7
4 9 2 9 8 1 8 7
5 3 9 2 9 8 1 8 7
9 8 6 4 3 9 2 9 8 1 8 7
2 3 5 8 6 4 3 9 2 9 8 pp ppppp 1
7 6 5 2 1 6 4 3 9 2 9 pp ppppp 8
6 8 1 6 5 2 1 6 4 3 9 pp ppppp 2
7 8 5 8 1 6 5 2 1 6 4 pp ppppp 3 h h
h
h h h h h h h h h h h h 6 6
h
? ? ? ? ? ? ? ? ? visited visited
Stack:
: oberstes Stackelement : schon besuchte Knoten
: Nachbarn Zustand:
a) b) c) d) e) f)
g)
h) i)
j)
Wir betrachten den Stackzustand:
Im Zustand g) sind die Elemente 2, 3 und 5 als visited markiert (siehe Zust¨ ande b), c) und e)). Deswegen werden sie aus dem Stack entfernt, und das Element 8 wird zum obersten Stackelement. Im Zustand j) sind alle Elemente markiert, so dass eins nach dem anderen aus dem Stack entfernt wird.
Diskrete Strukturen 4.1 Tiefensuche, Depth-First-Search 487/571
c
Ernst W. Mayr
algorithm advanced DFS
void proc DFSvisit(node v ) visited[v ] := true
pre[v ] := ++precount
for all u ∈ adjacency list[v ] do if not visited[u ] then
type[(v ,u )] := ’Baumkante’
parent[u ] := v
DFSlevel[u ] := DFSlevel[v ]+1 DFSvisit(u )
elsif u 6= parent[v ] then
type[(v ,u )] := ’R¨ uckw¨ artskante’
fi
od
Fortsetzung
co Initialisierung: oc for all v ∈ V do
visited[v ] := false pre[v ] := post[v ] := 0 od
precount := postcount := 0 for all v ∈ V do
if not visited[v ] then DFSlevel[v ] := 0 parent[v ] := null DFSvisit(v )
fi od end
Diskrete Strukturen 4.1 Tiefensuche, Depth-First-Search 489/571
c
Ernst W. Mayr
Beispiel 300 (gestrichelt sind R¨ uckw¨ artskanten)
DFS-Level:
Pr¨ aorder-Nummer:
Beispiel (Fortsetzung) Postorder-Nummer:
Diskrete Strukturen 4.1 Tiefensuche, Depth-First-Search 491/571
c
Ernst W. Mayr
Beobachtung: Die Tiefensuche konstruiert einen Spannwald des Graphen. Die Anzahl der B¨ aume entspricht der Anzahl der Zusammenhangskomponenten von G.
Satz 301
Der Zeitbedarf f¨ ur die Tiefensuche ist (bei Verwendung von Adjazenzlisten) O |V | + |E|
.
Beweis:
Aus Algorithmus ersichtlich.
Tiefensuche im Digraphen: F¨ ur gerichtete Graphen verwendet man obigen Algorithmus, wobei man die Zeilen
elsif u 6= parent[v ] then
type[(v ,u )] := ’R¨ uckw¨ artskante’
fi ersetzt durch
elsif pre[u ] > pre[v ] then
type[(v ,u )] := ’Vorw¨ artskante’
elsif post[u ] 6 = 0 then
type[(v ,u )] := ’Querkante’
else
type[(v ,u )] := ’R¨ uckw¨ artskante’
fi
Diskrete Strukturen 4.1 Tiefensuche, Depth-First-Search 493/571
c
Ernst W. Mayr
Beispiel 302 (Pr¨ aorder-Nummer)
11
13
14 12
15 1
2
3
4 5 7
6
8 10
9
Querkante Vorwärtskante Rückwärtskante Baumkante
4.2 Breitensuche, Breadth-First-Search
Sei G = (V, E) ein ungerichteter Graph, gegeben mittels Adjazenzlisten.
BFS-Algorithmus:
while ∃ unvisited v do
r := pick (random) unvisited node push r into (end of) queue
while queue 6= ∅ do
v := remove front element of queue if v unvisited then
mark v visited
append all neighbours of v to end of queue perform operations BFS Ops(v)
fi od od
Diskrete Strukturen 4.2 Breitensuche, Breadth-First-Search 495/571
c
Ernst W. Mayr
Beispiel 303
B B
B B
B B A
A A
A
B B
B B
B B Q
Q Q
Q Q
Q
H H H H
B B
B B
B B A
A A
A
B B
B B
B B Q
Q Q
Q Q
Q
H H H H
B B
B B
B B N A
A A
A
U ?
B B
B B
B B N Q
Q Q
Q Q
Q s H H
H H j 1 g
2 g
6 g
9 g g
8 5 g
3 g
4 g
7 g 1 t
2 t
3 t
4 t 5 t
t 6 t 7 8 t
9 t Q
Q Q
Q Q
Q
@
@
@
@
Beobachtung: Die markierten Kanten bilden einen Spannbaum:
B B
B B
B B A
A A
A
B B
B B
B B Q
Q Q
Q Q
Q
H H H H
B B
B B
B B A
A A
A
B B
B B
B B Q
Q Q
Q Q
Q
H H H H
B B
B B
B B N A
A A
A
U ?
B B
B B
B B N Q
Q Q
Q Q
Q s H
H H H j 1 g
2 g
6 g
9 g g
8 5 g
3 g
4 g
7 g 1 t
2 t
3 t
4 t 5 t
t 6 t 7 8 t
9 t Q
Q Q
Q Q
Q
@
@
@
@
pppppppppppppppppppppppppppppppppppppppppppppppppppppppppppp ppppppppppppppppppppppppppppppppppp
pppppp pppppp pppppp pppppp pppppppppppppppppppppppp pppp pppp pppp H H
Y
Querkanten 1 g
2 g 3 g 4 g
5 g 6 g
7 g 8 g
9 g
B B
B H
H H H H
H
J J
J J
J J
J J
J s
s s s
s
s s s
s
Diskrete Strukturen 4.2 Breitensuche, Breadth-First-Search 497/571
c
Ernst W. Mayr
Folge der Queuezust¨ ande
1 2 8 7 8 7 1 8 9 3 7 1 8 9 3 1 2 6 7 5 1 8 9 3 1 2 6 7 5 1 8 6 3 1 2 6 7 5 1 8 6 5 3 2 1 2 6 7 5 1 8 6 5 3 2 4 9 2 7 5 1 8 6 5 3 2 4 9 2 7 8 5 1 8 6 5 3 2 4 9 2 7 8 5 6 8 9 4
j j
j j j
j j j j j j visited
visited visited visited
Zustand:
Queue:
(a (b (c (d (e (f (g (h (i
Wir betrachten die Folge der Queuezust¨ ande. Wiederum bedeutet die Notation:
i
: vorderstes Queue-Element : schon besuchte Knoten
: Nachbarn
Im Zustand e) sind die Elemente 1 und 8 als visited markiert (siehe Zust¨ ande a) und c)). Deswegen werden sie aus der Queue entfernt, und so wird das Element 9 das vorderste Queueelement. Das gleiche passiert in den Zust¨ anden g), h) und i). Im Zustand j) sind alle Elemente markiert, so dass sie eins nach dem anderen aus der Queue entfernt werden.
Diskrete Strukturen 4.2 Breitensuche, Breadth-First-Search 499/571
c
Ernst W. Mayr
algorithm advanced BFS for all v ∈ V do
touched[v ] := false bfsNum[v ] := 0 od
count := 0 queue := 6 0 for all v ∈ V do
if not touched[v] then bfsLevel[v ] := 0 parent[v ] := null queue .append(v ) touched[v ] := true
while not empty(queue ) do
Fortsetzung
for all w ∈ adjacency list[u ] do if not touched[w ] then
type[(u ,w )] := ’Baumkante’
parent[w ] := u
bfsLevel[w] := bfsLevel[u]+1 queue .append(w )
touched[w] := true
elsif not w = parent[u] then type[(u ,w )] := ’Querkante’
fi od od fi od end
Diskrete Strukturen 4.2 Breitensuche, Breadth-First-Search 501/571
c
Ernst W. Mayr
Beobachtungen:
1
Die Breitensuche konstruiert einen Spannwald.
2
Der Spannwald besteht genau aus den Baumkanten im Algorithmus.
3
(u, v) ist Querkante ⇒
bfsLevel(u) − bfsLevel(v)
≤ 1
Satz 304
Der Zeitbedarf f¨ ur die Breitensuche ist (bei Verwendung von Adjazenzlisten) O |V | + |E|
.
Beweis:
Aus Algorithmus ersichtlich.
Diskrete Strukturen 4.2 Breitensuche, Breadth-First-Search 503/571
c
Ernst W. Mayr
4.3 Matroide
Definition 305
Sei S eine endliche Menge, U ⊆ 2
Seine Teilmenge der Potenzmenge von S. Dann heißt M = (S, U ) ein Matroid und jedes A ∈ U heißt unabh¨ angige Menge, falls gilt:
1
∅ ∈ U
2
A ∈ U, B ⊆ A = ⇒ B ∈ U
3
A, B ∈ U, |B| = |A| + 1
= ⇒ (∃x ∈ B \ A) h
A ∪ {x}
∈ U i
Jede bez¨ uglich ⊆ maximale Menge in U heißt Basis.
Nach 3. haben je zwei Basen gleiche Kardinalit¨ at. Diese heißt der Rang r(M ) des
Beispiel 306
Linear unabh¨ angige Vektoren in einem Vektorraum.
Beispiel 307
G sei folgender Graph:
S = Menge der Kanten von G
U = Menge der kreisfreien Teilmengen von S
Diskrete Strukturen 4.3 Matroide 505/571
c
Ernst W. Mayr