• Keine Ergebnisse gefunden

Sei G = (V, E) ein ungerichteter Graph, gegeben als Adjazenzliste.

N/A
N/A
Protected

Academic year: 2021

Aktie "Sei G = (V, E) ein ungerichteter Graph, gegeben als Adjazenzliste."

Copied!
24
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

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.

(2)

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

(3)

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

(4)

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

(5)

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)

(6)

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.

(7)

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

post[v ] := ++postcount

end proc

(8)

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

(9)

Beispiel 300 (gestrichelt sind R¨ uckw¨ artskanten)

DFS-Level:

Pr¨ aorder-Nummer:

(10)

Beispiel (Fortsetzung)

Postorder-Nummer:

(11)

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.

(12)

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

(13)

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

(14)

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

(15)

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

@

@

@

@

(16)

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

(17)

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

9 2 7 8 5 6 8 9 4 5 3

j j

j j j

j j j j j j

j j j j j j j j j j j visited

visited visited visited

visited

Zustand:

Queue:

(a

(b

(c

(d

(e

(f

(g

(h

(i

(j

(18)

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.

(19)

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

u := remove first(queue )

bfsNum[u] := ++count

(20)

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

(21)

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

(22)

Satz 304

Der Zeitbedarf f¨ ur die Breitensuche ist (bei Verwendung von Adjazenzlisten) O |V | + |E|

.

Beweis:

Aus Algorithmus ersichtlich.

(23)

4.3 Matroide

Definition 305

Sei S eine endliche Menge, U ⊆ 2 S eine 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

Matroids.

(24)

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

Referenzen

ÄHNLICHE DOKUMENTE

Vertauscht man auf diesem Pfad gematchte und ungematchte Kanten, erh¨ alt man dadurch ein Matching M 0 mit |M 0 | = |M | + 1, was wiederum einen Widerspruch darstellt:... Von

Aufgabe 3: Barycenter-Heuristik im OGDF (Bearbeitungszeit: 2 Wochen, 10 Punkte) Schreiben Sie ein Programm innerhalb des OGDF, das die Barycenter-Heuristik zur Kreuzungsminimierung

[r]

(a) Definitionsbereich ist zusammenh¨ angend, Integrabilit¨ atsbedingung ist nicht erf¨ ullt ⇒ nicht kon- servativ. (b) Definitionsbereich ist zusammenh¨ angend,

Wenn wir die Kante e jetzt wieder einf¨ ugen, kann sie h¨ ochstens zwei Knoten mit Grad 1 verbinden, es verbleiben also mindestens zwei weitere.. (2) Entweder G 1 oder G 2 enth¨ alt

Peter Becker Fachbereich Informatik Wintersemester 2015/16 17.. November 2015 in

♠ Nur gut leserliche, sauber gegliederte L¨ osungen mit sofort auffindbaren Resultaten k¨ onnen korrigiert werden.. (Ersichtlicher

(d) Verwenden Sie die Vorausschautabelle, um eine akzeptierende Konfigu- rationsfolge f¨ ur ha+ai