Slide 1
Graphen
und ihre Implementierung
Klaus Becker
2007
Slide 2
Graphen
2
KO
54
128
RB
28
35
BI
98
33
35
TR
MZ
AZ
36
48
116
FT
KL
48
31
SP
Zielsetzung: Am Beispiel von Graphen
Standardalgorithmen zur Lösung von Standardproblemen erkunden
eine vorgegebene Klasse zur Erledigung von Standardaufgaben
benutzen (und erweitern)
Slide 3
3
Teil 1
Graphen und Graphenprobleme
Slide 4
4
tratsCH trATsch
23. Bundeswettbewerb Informatik:
siehe: http://www.mk-intern.bildung-lsa.de/Bildung/be-bundeswettbewerbinformatik2004_2005.pdf
Slide 5
5
tratsCH trATsch
23. Bundeswettbewerb Informatik:
Slide 6
6
Aufgabe
Stellen Sie die in der Tabelle abgebildeten
Informationen möglichst übersichtlich
grafisch dar.
Über wen darf A Schlechtes schreiben,
ohne einen Charmefehler zu riskieren?
Slide 7
Graphen
7
Graphen sind mathematische Strukturen, mit deren Hilfe man Objekte und
die sie verbindenden Beziehungen beschreibt. Ein Graph besteht dabei aus
sog. Knoten und Kanten. Die Knoten repräsentieren die Objekte, die
Kanten die Beziehungen zwischen den Objekten.
E
B
F
A
D
G
H
C
Mathematisch: G = (V, E)
V = {A, B, C, D, E, F, G} ist die Menge der Knoten.
E = {(A,B), (A,E), (B,C), ..., (H,D)} ist die Menge der Kanten.
Slide 8
Typen von Graphen
8
Je nach Anwendung ist es sinnvoll, Kanten gerichtet oder ungerichtet zu
modellieren. Bei gerichteten Graphen werden in der Regel auch sog.
Schlingen zugelassen. Werden die Kanten mit zusätzlichen Gewichten
versehen, so spricht man von gewichteten oder bewerteten Graphen.
E
B
E
B
5
12
8
F
A
11
F
A
D
D
17
G
C
gerichteter, unbewerteter Graph
3
H
C
6
8
G
5
ungerichteter, bewerteter Graph
H
Slide 9
Klassische Graphenprobleme
9
Wege, Erreichbarkeit:
Gibt es einen Weg zwischen Knoten X und Knoten Y?
E
B
F
A
D
G
H
C
Kann Tratsch von A nach H gelangen? Kann Tratsch von H nach A gelangen?
Slide 10
Klassische Graphenprobleme
10
Zusammenhang, Zyklen:
Gibt es von jedem Knoten zu jedem anderen Knoten einen Weg entlang der
Kanten?
Gibt es Zyklen (d. h. geschlossene Wege) innerhalb des Graphen?
E
B
F
A
D
G
H
C
Von H gibt es keinen Weg zu A. Der Graph ist nicht stark zusammenhängend.
Der Graph enthält Zyklen, z. B. C -> G -> H -> D -> C
Slide 11
11
Klassische Graphenprobleme
Euler-Weg / Euler-Kreis:
Gibt es einen (geschlossenen) Weg, der jede Kante genau einmal besucht?
Königsberger Brückenproblem
Haus des Nikolaus
Slide 12
12
Klassische Graphenprobleme
Hamilton-Kreis / Rundreise:
Gibt es einen geschlossenen
Weg, der jeden Knoten genau
einmal besucht?
Rundreise durch alle 15112
Gemeinden in Deutschland
siehe: http://www.tsp.gatech.edu/d15sol/d15map.html
Slide 13
13
Klassische Graphenprobleme
Abstände:
Wie viele Stationen liegen zwischen einem Startknoten X und einem
Zielknoten Y?
siehe: http://www.mvv-muenchen.de/web4archiv/objects/download/2/schnellbahnnetz_2007.pdf
Slide 14
14
Klassische Graphenprobleme
kürzeste Wege:
Welcher Weg zwischen Knoten X und Knoten Y ist der kürzeste?
KO
54
128
RB
28
35
MZ
BI
98
33
35
TR
AZ
36
48
116
FT
KL
48
31
SP
kürzester Weg von SP nach KO: SP -> FT -> AZ -> BI -> RB -> KO
Slide 15
15
Teil 2
Graphenalgorithmen
Fallstudie: Wege in Graphen
Slide 16
Problem 1: Graphen durchlaufen
16
Problem: Welche Knoten kann man von einem Startknoten aus mit einem
Weg entlang der Kanten erreichen?
E
B
F
A
D
G
C
H
Slide 17
17
Problem 2: Abstände bestimmen
Problem: Wie viele Knoten liegt ein Zielknoten vom Startknoten entfernt?
Slide 18
18
Problem 3: kürzeste Wege bestimmen
Problem: Welcher Weg von einem Startknoten zu einem Zielknoten ist am
kürzesten?
KO
54
128
RB
28
35
BI
98
33
35
TR
MZ
AZ
36
48
116
FT
KL
48
31
SP
Slide 19
19
Aufgabe
Überlegen Sie sich selbst ein Verfahren, wie man eines der vorgestellten
Probleme lösen kann.
Tipp: Nutzen Sie die Möglichkeit, Zusatzinformationen an Knoten zu
schreiben.
Slide 20
20
Aufgabe
Sie können sich auch auf den Webseiten des "(Math)e(prism)a" informieren. Hier
finden Sie Algorithmen zur Lösung der drei vorgestellten Probleme.
Quelle: http://www.matheprisma.uni-wuppertal.de/Module/Graphen/index.htm
Benutzen Sie das Programm "Shortest Path Animation", um die Grundidee des
Algorithmus von Dijkstra zur Lösung von Problem 3 herauszufinden.
Quelle: http://www.educeth.ch/informatik/puzzles/routing/docs/dijkstra.exe
Slide 21
21
Algorithmus "Graph durchlaufen"
{Eingabe: Graph G; Startknoten s des Graphen}
für alle Knoten w
markiere w als nicht besucht
füge s in eine (zunächst leere) Datenstruktur D ein
solange D nicht leer ist
entnimm einen Knoten w aus D
für alle Kanten {w,u}
falls u nicht markiert ist
markiere u
füge u in D ein
{Ausgabe: Markierungen für alle Knoten w von G; ein Knoten ist genau
dann als 'besucht' markiert, wenn er üben einen Weg mit s verbindbar ist}
Quelle: http://www.matheprisma.uni-wuppertal.de/Module/Graphen/index.htm
Slide 22
Beispiel
22
B
0
F
D
C
0
B
D
C
E
A
S
Vorbereitungsschritt
markiere alle Knot. als nicht besucht (hier 0)
markiere S als besucht (hier 1)
füge s in e. Datenstruktur D (hier grün) ein
0
B
F
D
C
1
0
0
0
0
A
0
0
1
entnimm einen Knoten w (hier blau) aus D
für alle Kanten {w,u}
falls u nicht markiert ist
markiere u
füge u in D ein
Wiederholungsschritt
0
1
B
F
D
C
E
S
0
E
S
0
F
0
E
A
S
0
1
1
A
0
0
Slide 23
Beispiel
23
0
1
B
F
D
C
0
0
0
1
B
D
C
E
S
1
A
S
0
1
B
F
D
C
1
1
1
B
1
1
B
D
C
A
S
0
1
F
D
C
S
0
1
1
0
1
1
A
1
1
Auswahlstrategie
Last In
First Out
-> Tiefensuche
1
0
1
B
F
D
C
E
A
F
E
1
0
0
E
S
1
entnimm einen Knoten w (hier blau) aus D
für alle Kanten {w,u}
falls u nicht markiert ist
markiere u
füge u in D ein
Auswahlstrategie
First In
First Out
-> Breitensuche
1
0
0
E
1
0
F
1
E
A
S
1
1
1
A
1
0
Slide 24
Beispiel
24
1
1
B
F
D
C
1
0
1
1
B
D
C
E
S
F
0
1
E
1
1
A
S
1
1
A
1
1
entnimm einen Knoten w (hier blau) aus D
für alle Kanten {w,u}
falls u nicht markiert ist
markiere u
füge u in D ein
1
1
B
F
D
C
1
1
0
1
1
1
F
D
C
E
S
B
Ergebnis:
Von S aus gibt es Wege zu
den folgenden Knoten:
A, B, C, D, E.
1
E
A
S
1
1
1
A
1
0
Slide 25
25
Algorithmus von Moore
{Eingabe: Graph G; Startknoten s des Graphen}
für alle Knoten w
setze dg(w) = ∞
setze dg(s) = 0
füge s in eine (zunächst leere) Datenstruktur D ein
solange D nicht leer ist
entnimm einen Knoten w aus D
für alle Kanten {w,u}
falls dg(u) = ∞
setze dg(u) = dg(w)+1
füge u in D ein
{Ausgabe: Abstand d(w) aller Knoten w von s; Knoten mit d(w) = ∞ sind
nicht mit s verbindbar}
Quelle: http://www.matheprisma.uni-wuppertal.de/Module/Graphen/index.htm
Slide 26
Beispiel
26
B
∞
F
D
C
∞
B
D
C
E
A
S
Vorbereitungsschritt
für alle Knoten w
setze dg(w) = ∞
setze dg(s) = 0
füge s in eine Datenstruktur D (hier grün) ein
∞
B
F
D
C
0
∞
∞
∞
∞
A
∞
∞
0
entnimm einen Knoten w (hier blau) aus D
für alle Kanten {w,u}
falls dg(u) = ∞
setze dg(u) = dg(w)+1
füge u in D ein
Wiederholungsschritt
∞
1
B
F
D
C
E
S
∞
E
S
∞
F
∞
E
A
S
∞
0
1
A
∞
∞
Slide 27
Beispiel
27
∞
1
B
F
D
C
∞
∞
∞
1
B
D
C
E
S
F
∞
∞
2
1
B
D
C
E
1
0
A
S
∞
0
F
∞
2
E
1
A
S
∞
0
A
1
2
entnimm einen Knoten w (hier blau) aus D
für alle Kanten {w,u}
falls dg(u) = ∞
setze dg(u) = dg(w)+1
füge u in D ein
∞
1
B
F
D
C
2
∞
∞
1
0
1
F
D
C
E
S
B
2
3
∞
1
S
∞
0
1
F
D
C
E
A
B
2
E
A
S
2
0
1
A
2
∞
Slide 28
Beispiel
28
3
1
B
F
D
C
3
∞
2
1
B
D
C
E
S
F
∞
2
E
1
0
A
S
2
0
A
1
2
entnimm einen Knoten w (hier blau) aus D
für alle Kanten {w,u}
falls dg(u) = ∞
setze dg(u) = dg(w)+1
füge u in D ein
3
1
B
F
D
C
2
3
∞
1
0
1
F
D
C
E
S
B
Ergebnis:
Von S aus beträgt der
Abstand zu C und E jeweils
1, zu A und D jeweils 2, zu
B 3 und zu F ∞.
2
E
A
S
2
0
1
A
2
∞
Slide 29
29
Algorithmus von Dijkstra
{Eingabe: Graph G; Startknoten s des Graphen}
für alle Knoten w
setze dg(w) = ∞
setze dg(s) = 0
füge s in eine (zunächst leere) Datenstruktur D ein
solange D nicht leer ist
entnimm einen Knoten w mit minimalem dg(w) aus D
für alle Kanten {w,u}
falls dg(u) = ∞
füge u in D ein
falls dg(u) > dg(w) + g({w,u})
setze dg(u) = dg(w)+g({w,u})
{Ausgabe: gewichteter Abstand dg(w) aller Knoten w vom Startknoten s}
Quelle: http://www.matheprisma.uni-wuppertal.de/Module/Graphen/index.htm
Slide 30
Beispiel
30
3
B
∞
F
8
1
D
C
13
20
16
2
13
20
2
A
19
3
B
8
10
∞
F
C
13
20
∞
16
0
2
∞
∞
19
A
∞
entnimm e. Knoten w m. min. dg(w) aus D
für alle Kanten {w,u}
falls dg(u) = ∞ füge u in D ein
falls dg(u) > dg(w) + g({w,u})
setze dg(u) = dg(w)+g({w,u})
Wiederholungsschritt
∞
3
B
1
∞
2
10
20
F
8
C
13
20
E
S
2
0
4
D
2
S
für alle Knoten w
setze dg(w) = ∞
setze dg(s) = 0
füge s in eine Datenstruktur D (hier grün) ein
1
16
E
Vorbereitungsschritt
∞
∞
D
C
E
S
∞
4
10
∞
F
8
1
4
10
3
B
4
D
∞
16
2
19
A
E
19
A
S
∞
0
2
2
∞
∞
Slide 31
Beispiel
31
∞
3
B
∞
∞
8
1
13
20
∞
D
C
16
20
2
2
2
F
∞
∞
8
D
4
∞
16
2
10
C
13
20
E
S
3
B
1
4
10
20
F
1
0
A
S
∞
0
2
2
∞
4
10
20
F
8
D
C
13
20
E
19
3
B
30
16
2
19
A
E
19
A
S
21
0
2
2
21
entnimm e. Knoten w m. min. dg(w) aus D
für alle Kanten {w,u}
falls dg(u) = ∞ füge u in D ein
falls dg(u) > dg(w) + g({w,u})
setze dg(u) = dg(w)+g({w,u})
∞
3
B
∞
∞
8
1
10
20
F
C
13
20
16
∞
2
20
10
C
13
20
E
S
0
2
2
F
∞
D
4
30
16
2
1
10
20
A
S
21
0
2
2
F
8
C
13
20
E
19
3
B
∞
8
1
4
D
3
B
4
D
23
16
2
19
A
E
19
A
S
21
0
2
2
21
∞
Slide 32
Beispiel
32
∞
3
B
31
∞
8
1
D
C
13
20
16
23
2
2
2
∞
4
10
20
F
8
D
23
16
2
19
A
C
13
20
E
S
3
B
1
4
10
20
F
E
A
S
21
0
19
0
2
2
21
entnimm e. Knoten w m. min. dg(w) aus D
für alle Kanten {w,u}
falls dg(u) = ∞ füge u in D ein
falls dg(u) > dg(w) + g({w,u})
setze dg(u) = dg(w)+g({w,u})
31
3
B
31
∞
8
1
10
20
F
C
13
20
D
16
23
2
10
20
0
2
2
F
8
C
13
20
E
S
3
B
1
4
Ergebnis:
Von S aus beträgt der
kürzeste Weg zu E 2, zu C
20, zu A 21, zu D 23, zu B
31 und zu F ∞.
4
D
23
16
2
19
A
E
19
A
S
21
0
2
2
21
∞
Slide 33
33
Teil 3
Implementierung von Graphen
Slide 34
Darstellung: Matrix oder Liste
34
AZ
BI/35
FT/36
KL/48
MZ/33
BI
AZ/35
MZ/35
RB/28
FT
AZ/36
KL/48
SP/31
KL
AZ/48
FT/48
TR/116
KO
RB/54
TR/128
MZ
AZ/33
BI/35
AZ
AZ
BI/28
SP
FT/31
TR
KL/116
KO/54
36
KL
48
KL
35
36
48
KO
TR/128
31
116
128
35
28
54
98
31
TR
116
KO/128
28
MZ
33
35
TR
AZ
36
48
FT
48
128
98
Adjazenzmatrix
35
BI
KL
TR
28
54
33
SP
33
48
128
116
RB
48
SP
98
MZ
35
RB
RB
Adjazenzliste
FT
MZ
54
RB/98
35
FT
KO
KO
RB
BI
BI
31
SP
Slide 35
Einfache Version
35
AZ
Grundidee:
AZ
Die Adjazenzmatrix wird mit
Hilfe einer zweidimensionalen
Reihung dargestellt.
BI
35
FT
36
KL
48
BI
FT
KL
35
36
48
KO
35
48
116
28
54
SP
TR
116
128
35
MZ
BI
98
33
35
TR
AZ
36
48
116
FT
KL
98
31
28
48
128
35
RB
RB
TR
31
48
33
SP
28
54
MZ
54
RB
33
KO
KO
MZ
31
SP
128
98
Slide 36
36
Einfache Version
Grundidee:
Die Adjazenzmatrix wird mit
Hilfe einer zweidimensionalen
Reihung dargestellt.
AZ
AZ
BI
35
FT
36
KL
48
BI
FT
KL
35
36
48
KO
RB
RB
35
TR
28
48
31
48
116
54
33
SP
33
KO
MZ
MZ
128
35
28
SP
TR
54
31
116
type
tKnoten = (A, B, F, K, O, M, R, S, T);
tAdjMatrix = array [tKnoten, tKnoten] of real;
const
graph: tAdjMatrix =
((-1, 35, 36, 48, -1, 33, -1, -1, -1),
(35, -1, -1, -1, -1, 35, 28, -1, -1),
...
(-1, -1, -1,116,128, -1, 98, -1, -1));
98
128
98
Slide 37
Objektorientierte Version
37
AZ
BI/35
FT/36
KL/48
BI
AZ/35
MZ/35
RB/28
FT
AZ/36
KL/48
SP/31
KL
AZ/48
FT/48
TR/116
KO
RB/54
TR/128
MZ
AZ/33
BI/35
RB
BI/28
KO/54
KO
MZ/33
54
128
RB
28
35
BI
98
TR
SP
FT/31
TR
KL/116
RB/98
KO/128
33
35
TR/128
MZ
AZ
36
48
116
FT
Grundidee:
- Jeder Knoten ist ein Objekt.
- Jede Kante ist ein Objekt.
KL
48
31
SP
Slide 38
Objektorientierte Version
38
:TList
0
1
2
3
MZ/33
0
AZ
:TList
BI/35
FT/36
KL/48
1
BI
:TList
AZ/35
MZ/35
RB/28
2
FT
:TList
AZ/36
KL/48
SP/31
3
KL
:TList
AZ/48
FT/48
TR/116
5
KO
:TList
RB/54
TR/128
6
MZ
:TList
AZ/33
BI/35
6
RB
:TList
BI/28
KO/54
TR/128
7
SP
:TList
FT/31
8
TR
:TList
KL/116
RB/98
KO/128
TGraph
- alleKnoten: TList
+
+
+
+
create
neuerKnoten(n: string)
neueKante(n1, n2: string; g: double)
getAlleKnoten: TList
*
TKante
*
*
TKnoten
- zielKnoten: TKnoten
- gewicht: double
- name: string
- kanten: TList
+ create(k: TKnoten; g: double)
+ getZielKnoten: TKnoten
+ getGewicht: double
+
+
+
+
create(n: string)
fuegeHinzu(k: TKante)
getName: string
getKanten: TList
Slide 39
39
Zielsetzung
Ziel ist es, ein Programm zu entwickeln, mit dessen Hilfe man Graphen
verwalten kann. Folgende Anforderungen soll das Programm erfüllen:
/1/ Der Benutzer kann die Knoten und Kanten eines (gewichteten) Graphen
schrittweise eingeben.
/2/ Die aktuellen Knoten und Kanten eines Graphen werden (in einfacher
Form) auf der Benutzungsoberfläche angezeigt.
/3/* Der Benutzer kann nachträglich auch Knoten und Kanten des
eingegebenen Graphen löschen.
/4/* Man kann sich einen kürzesten Weg von einem eingegebenen Startzu einem eingegebenen Zielknoten berechnen und anzeigen lassen.
...
Slide 40
40
Fertige Klasse nutzen
Häufig findet man zu Standardproblemen
fertige Lösungen in Form implementierter
Klassen.
TGraph
Wir gehen im Folgenden davon aus, dass
es eine (halb-) fertig implementierte Klasse
TGraph gibt, deren Funktionalitäten wir
direkt für unsere Zwecke nutzen können.
- alleKnoten: TList
+
+
+
+
create
neuerKnoten(n: string)
neueKante(n1, n2: string; g: double)
getAlleKnoten: TList
*
TKante
*
*
TKnoten
- zielKnoten: TKnoten
- gewicht: double
- name: string
- kanten: TList
+ create(k: TKnoten; g: double)
+ getZielKnoten: TKnoten
+ getGewicht: double
+
+
+
+
create(n: string)
fuegeHinzu(k: TKante)
getName: string
getKanten: TList
Slide 41
41
Aufgabe
Auf den folgenden Folien finden Sie eine
Dokumentation zu den dargestellten
Klassen. Schauen Sie sich diese
Dokumentation zunächst genau an und
nutzen Sie sie bei der weiteren Arbeit.
TGraph
- alleKnoten: TList
+
+
+
+
create
neuerKnoten(n: string)
neueKante(n1, n2: string; g: double)
getAlleKnoten: TList
*
TKante
*
*
TKnoten
- zielKnoten: TKnoten
- gewicht: double
- name: string
- kanten: TList
+ create(k: TKnoten; g: double)
+ getZielKnoten: TKnoten
+ getGewicht: double
+
+
+
+
create(n: string)
fuegeHinzu(k: TKante)
getName: string
getKanten: TList
Slide 42
42
Dokumentation der Klasse TKnoten
Konstruktor create (n: string)
nachher: Es ist ein Knoten mit dem Namensattributwert "name" erzeugt worden. Zudem ist
ein Listenobjekt zur Verwaltung von Kanten erzeugt worden. Es gibt noch keine
Kantenobjekte, die mit dieser Liste verwaltet werden.
Auftrag fuegeHinzu(k: TKante)
nachher: Ein Kantenobjekt ist in die Liste zur Verwaltung der Kanten aufgenommen worden.
Anfrage getName: string
nachher: Die Anfrage liefert den Namen des Knotens.
Anfrage getKanten: TList
nachher: Die Anfrage liefert die Liste der Kanten des Knotens. Hat der Knoten keine Kanten,
wird der Wert "nil" zurückgeliefert.
Destruktor destroy
nachher: Der Knoten existiert nicht mehr.
TKnoten
- name: string
- kanten: TList
+
+
+
+
create(n: string)
fuegeHinzu(k: TKante)
getName: string
getKanten: TList
Slide 43
43
Dokumentation der Klasse TKante
Konstruktor create (k: TKnoten; g: double)
nachher: Es ist eine gerichtete Kante mit dem Zielknoten / Nachbarknoten "k" und dem
Gewicht "g" erzeugt worden.
Anfrage getZielKnoten: string
nachher: Die Anfrage liefert den Namen des Zielknotens.
Anfrage getGewicht: double
nachher: Die Anfrage liefert das Gewicht der Kante.
Destruktor destroy
nachher: Die Kante existiert nicht mehr.
TKante
- zielKnoten: TKnoten
- gewicht: double
+ create(k: TKnoten; g: double)
+ getZielKnoten: TKnoten
+ getGewicht: double
Slide 44
44
Dokumentation der Klasse TGraph
Konstruktor create
nachher: Es ist ein neues Graphobjekt erzeugt worden. Zudem ist ein Listenobjekt zur
Verwaltung aller Knoten erzeugt worden. Es gibt noch keine Knotenobjekte, die mit dieser
Liste verwaltet werden.
Auftrag neuerKnoten(n: string)
nachher: Falls noch kein Knoten mit Namen "n" in der Liste aller Knoten vorkommt, so wird ein
neues Knotenobjekt mit dem übergebenen Parameter als Namensattributwert erzeugt und in
die Liste aller Knoten eingefügt. Ansonsten bleibt die Liste aller Knoten wie bisher.
Auftrag neueKante(n1, n2: string; g: double)
nachher: Falls noch keine Kante von Knoten "n1" zu Knoten "n2" existiert, so wird ein neues
Kantenobjekt erzeugt und in die Liste aller Kanten zum Knoten "n1" hinzugefügt.
Anfrage getAlleKnoten: TList
nachher: Die Anfrage liefert die Liste aller Knoten des Graphen.
Destruktor destroy
nachher: Der Graph existiert nicht mehr.
TGraph
- alleKnoten: TList
+
+
+
+
create
neuerKnoten(n: string)
neueKante(n1, n2: string; g: double)
getAlleKnoten: TList
Slide 45
45
Aufgabe
Ziel: einen Graphen aufbauen
Entwickeln Sie eine passende Benutzungsoberfläche.
Erzeugen Sie ein Objekt der Klasse TGraph. Benutzen Sie die von der
Klasse TGraph bereit gestellten Methoden, um die Knoten und Kanten eines
vorgegebenen Graphen zu erzeugen.
Slide 46
46
Aufgabe
Ziel: einen Graphen anzeigen
Erweitern Sie die Benutzungsoberfläche passend.
Benutzen Sie die von der Klasse TGraph bereit gestellten Methoden, um auf
die Knoten und Kanten eines zuvor erzeugten Graphen zuzugreifen und die
zugehörigen Informationen anzuzeigen. Beachten Sie, dass die von TGraph
bereit gestellten Methoden Knoten bzw. Kanten als Listen zurückgeben.
Informieren Sie sich (z. B. im Demoprogramm „Listen“), wie man auf die
Objekte einer Liste zugreift und die verwalteten Daten anzeigt.
Slide 47
47
Aufgabe
Ziel: Knoten oder Kanten eines Graphen löschen
Die Klasse TGraph enthält noch keine Methoden, mit deren Hilfe man
Knoten oder Kanten eines Graphen löschen kann. Ergänzen Sie passende
Methoden und implementieren Sie diese.
Slide 48
48
Aufgabe
Ziel: Algorithmus von Dijkstra oder Moore implementieren
Erweitern Sie die Klasse TGraph um die Möglichkeit, kürzeste Wege mit
dem Algorithmus von Dijkstra oder Abstände mit dem Algorithmus von
Moore zu bestimmen (Achtung: etwas aufwendiger).
Sie können sich auch eine fertige Lösung zu einem der drei vorgestellten
Probleme anschauen (z. B. Graph durchlaufen) und diese dann zu einer
Lösung eines anderen Problems (z. B. Abstände bestimmen) umarbeiten.
Slide 49
49
Teil 4
Zusammenfassung
Slide 50
50
Standardlösungen
Warum das Rad neu erfinden? Oft ist es sinnvoll, fertige Lösungen zu
nutzen, anstatt selbst nach Lösungen zu suchen. Im Unterricht bieten sich
oft Situationen wie:
- einen Standardalgorithmus erkunden und nutzen
- eine vorgefertigte Klasse nutzen und ggf. erkunden und erweitern
{Eingabe: Graph G; Startknoten s des Graphen}
TGraph
für alle Knoten w
setze dg(w) = ∞
setze dg(s) = 0
füge s in eine (zunächst leere) Datenstruktur D ein
solange D nicht leer ist
entnimm einen Knoten w mit minimalem dg(w) aus D
für alle Kanten {w,u}
falls dg(u) = ∞
füge u in D ein
falls dg(u) > dg(w) + g({w,u})
setze dg(u) = dg(w)+g({w,u})
{Ausgabe: gewichteter Abstand dg(w)
aller Knoten w vom Startknoten s}
- alleKnoten: TList
+
+
+
+
create
neuerKnoten(n: string)
neueKante(n1, n2: string; g: double)
getAlleKnoten: TList
*
TKante
*
*
TKnoten
- zielKnoten: TKnoten
- gewicht: double
- name: string
- kanten: TList
+ create(k: TKnoten; g: double)
+ getZielKnoten: TKnoten
+ getGewicht: double
+
+
+
+
create(n: string)
fuegeHinzu(k: TKante)
getName: string
getKanten: TList
Slide 51
51
Literaturhinweise
Folgende Materialien wurden hier benutzt:
U. Schöning: Ideen der Informatik. Oldenbourg Verlag 2002.
P. Gritzmann, R. Brandenburg: Das Geheimnis des kürzesten Weges. Springer 2002.
Mathe-Prisma: Graphen
http://www.matheprisma.uni-wuppertal.de/Module/Graphen/index.htm
D. Jonietz: Graphen
http://informatik.bildung-rp.de/fileadmin/user_upload/informatik.bildungrp.de/Weiterbildung/pdf/WB-VIII-6-Graphen.pdf