18
FB Informatik Prof. Dr. R.Nitsch Programmieren 2 Future Car Projekt Praktikum 6 - Graphen Reiner Nitsch [email protected] - Speichern von Graphen - Traversieren von Graphen - Kürzeste Wege

FB Informatik Prof. Dr. R.Nitsch Programmieren 2 Future Car Projekt Praktikum 6 - Graphen Reiner Nitsch [email protected] - Speichern von Graphen -

Embed Size (px)

Citation preview

Page 1: FB Informatik Prof. Dr. R.Nitsch Programmieren 2 Future Car Projekt Praktikum 6 - Graphen Reiner Nitsch reiner.nitsch@h-da.de - Speichern von Graphen -

FB InformatikProf. Dr. R.Nitsch

Programmieren 2

Future Car Projekt

Praktikum 6 - Graphen

Reiner Nitsch [email protected]

- Speichern von Graphen- Traversieren von Graphen- Kürzeste Wege

Page 2: FB Informatik Prof. Dr. R.Nitsch Programmieren 2 Future Car Projekt Praktikum 6 - Graphen Reiner Nitsch reiner.nitsch@h-da.de - Speichern von Graphen -

FB InformatikProf. Dr. R.Nitsch

09.10.2008 Projekt FutureCar 2

Darstellung von Graphen als Array von Listen

• Grundlagen zu Graphen (siehe Vorlesung Mathematik 1)

1

6

2

5

3

4

Ungerichteter Graph G(V,E)V: KnotenmengeE: Kantenmenge

1

2

3

4

5

6

2

5

5

1

4

3

4

4

6

2

3

6

1

5

2

1

6

2

5

3

4

Gerichteter Graph

1

2

3

4

5

6

2

5

5

2

4

6

4

6

Adjazenzlisten erlauben Antwort auf Fragen zu Graphen G wie z.B.

• Wieviele Kanten enden an vi?

• Welche Nachbarn vj hat vi?

• Existiert Kante E=(vi,vj)? O(|Ei|)

Gewichteter Graph: Gewicht als zu-sätzliche Info der Listenelemente

Speicherbedarf? proportional zur Anzahl Knoten plus Anzahl Kanten O(|V|+|E|)

Adjazenzlisten

Die mit Knoten 5 direktverbundenen Nachbarknoten (= Kantenmenge E5 )

Array vonAdjazenzlisten

Page 3: FB Informatik Prof. Dr. R.Nitsch Programmieren 2 Future Car Projekt Praktikum 6 - Graphen Reiner Nitsch reiner.nitsch@h-da.de - Speichern von Graphen -

FB InformatikProf. Dr. R.Nitsch

09.10.2008 Projekt FutureCar 3

Darstellung von Graphen mit Adjazenzmatrix

Adjazenzmatrix a mit Elementen aij

aij = 1 wenn Kante E=(vi,vj) in G enthalten, sonst aij=0

1

6

2

5

3

4

Ungerichteter Graph G(V,E)

0 1 0 1 0 01 0 0 1 1 00 0 0 0 1 11 1 0 0 1 00 1 1 1 0 00 0 1 0 0 1

aij = aji (symmetrisch)

1

6

2

5

3

4

Gerichteter Graph G(V,E)

0 1 0 1 0 00 0 0 0 1 00 0 0 0 1 10 1 0 0 0 00 0 0 1 0 00 0 0 0 0 1

aij ≠ aji (unsymmetrisch)

Adjazenzlisten erlauben Antwort auf Fragen zu Graphen G wie z.B.

• Wieviele Kanten enden an vi?

• Welche Nachbarn vj hat vi?

• Existiert Kante E=(vi,vj) mit Zeitkomplexität O(1)

Speicherbedarf? O(|V|2)

ungünstig wenn G wenige

Kanten hatGewichteter Graph: Gewicht

an Stelle von '1' in Matrix eintragen

123456

i

1 2 3 4 5 6

j

Page 4: FB Informatik Prof. Dr. R.Nitsch Programmieren 2 Future Car Projekt Praktikum 6 - Graphen Reiner Nitsch reiner.nitsch@h-da.de - Speichern von Graphen -

FB InformatikProf. Dr. R.Nitsch

09.10.2008 Projekt FutureCar 4

Anwendungsbeispiel - FutureCar-Projekt

• Die FutureCar-Anwendung ist ein TestUnit für Autopilot-Algorithmen zur autonomen Steuerung von Fahrzeugen.

• Das TestUnit besteht aus einem virtuellen Straßenlabyrinth (FCWelt, s. Abb.) in dem sich viele virtuelle Fahrzeuge (FutureCars) gesteuert durch ihren individuellen Autopiloten unfallfrei bewegen müssen.

Allgemeine Vorgaben/Einschränkungen: • Die FCWelt soll auf einem zeichenorientierten Display

darstellbar sein. – Dazu muss sie rechteckig und in virtuelle Parzellen

(s. Abbildung) unterteilt sein.– Jede Parzelle symbolisiert ein FutureCar, ein Haus

oder einen Teil der Straße.– Alle Straßen sind zweispurig und verlaufen

senkrecht zueinander. Sie werden begrenzt durch Häuser.

– Jedes FutureCar verfügt über einen Scanner, zum Abtasten seiner unmittelbaren Umgebung

– Für Navigationsaufgaben ist das Straßennetz in Form von Adjazenzlisten darzustellen.

Page 5: FB Informatik Prof. Dr. R.Nitsch Programmieren 2 Future Car Projekt Praktikum 6 - Graphen Reiner Nitsch reiner.nitsch@h-da.de - Speichern von Graphen -

FB InformatikProf. Dr. R.Nitsch

09.10.2008 Projekt FutureCar 5

Adjazenzliste des Graphen der FutureCar World

# # # #

#

#

# #

0,0 1,0 2,0 3,0

0,1 1,1 2,1 3,1

0,2 1,2 2,2 3,2

0,3 1,3 2,3 3,3

x

y

1,1 1,2

3,1 2,1 3,2

2,1 1,1

1,2 1,3

3,2 3,1 4,2

2,2 3,2

Adjazenzlisten

Rasterkarte (Grid) von FC-City

Rasterkarte von FC-Citymit XY-Koordinaten:Jede Parzelle ist ein Knoten

Graph zur Modellierung derErreichbarkeitsbeziehungenzwischen den Zellender Rasterkarte

1

2

3

4

1 1; 1 2;2 1; 1 1;3 1; 2 1; 3 2;1 2; 1 3;2 2; 3 2;3 2; 3 1; 4 2;

Adjazenzlisten als Textsequenz (ohneKantengewichte)

5

Page 6: FB Informatik Prof. Dr. R.Nitsch Programmieren 2 Future Car Projekt Praktikum 6 - Graphen Reiner Nitsch reiner.nitsch@h-da.de - Speichern von Graphen -

FB InformatikProf. Dr. R.Nitsch

09.10.2008 Projekt FutureCar 6

Dateiformat des Graphen

# # # #

#

#

# #

0,0 1,0 2,0 3,0

0,1 1,1 2,1 3,1

0,2 1,2 2,2 3,2

0,3 1,3 2,3 3,3

x

y

Rasterkarte (Grid) von FC-City

Rasterkarte von FC-Citymit XY-Koordinaten:Jede Parzelle ist ein Knoten

Graph zur Modellierung derErreichbarkeitsbeziehungenzwischen den Zellender Rasterkarte

1

2

3

// Knotenliste(1,1)(1,2)(1,3)(2,1)(2,2)(2,3)(3,1)(3,2)…,…

// Kantenliste// <von>;<nach>;<Gewicht>;(1,1);(1,2);1(1,2);(1,3);(1,3);(2,3);30;(2,1);(1,1);1;(2,2);(3,2);1;(2,3);(2,2);1;(2,3);(1,3);30;(3,1);(2,1);1;(3,1);(3,2);30;(3,2);(3,1);30;…,…

Knoten und Kanten im Dateiformat

Page 7: FB Informatik Prof. Dr. R.Nitsch Programmieren 2 Future Car Projekt Praktikum 6 - Graphen Reiner Nitsch reiner.nitsch@h-da.de - Speichern von Graphen -

FB InformatikProf. Dr. R.Nitsch

3,13,1

1,11,1

2,12,1

1,21,2

3,23,2

2,2

09.10.2008 Projekt FutureCar 7

Implementierung mit indexbasierten Arrays

ProblemUm z.B. auf die Adjazenzliste des Knotens K=(3,1) zuzugreifen, braucht man

seinen Index. Diesen findet man in linearen Datentypen (Liste, Array) nur durch lineare Suche nach dem Schlüsselwert (3,1). Lineare Suche hat die Kosten O(N).

IdeeWenn man den Index von K direkt aus seinem Schlüsselwert (3,1) berechnen

könnte, wäre ein Suchverfahren mit konstanten Kosten, d.h. O(1) gefunden!Vorschläge?

Graph

- nodes:vector<Node>

+ Konstruktor + …

2,1 3,2

1,2

1,1

2,2 1,3

3,1 4,2

2,1 3,2 2,2

Adjazenzlisten

1

1..N

Location

+ x,y:int

ListElem

+ loc:Location + pnext:ListElem*

Page 8: FB Informatik Prof. Dr. R.Nitsch Programmieren 2 Future Car Projekt Praktikum 6 - Graphen Reiner Nitsch reiner.nitsch@h-da.de - Speichern von Graphen -

FB InformatikProf. Dr. R.Nitsch

09.10.2008 Projekt FutureCar 8

Traversieren von Graphen

• Als Traversieren bezeichnet man das systematische Besuchen aller Knoten und das Durchlaufen jeder Kante eines Graphen.

• Algorithmen zum Traversieren eines Graphen dienen als Basis für viele andere grundlegende Algorithmen zur Verarbeitung von Graphen

• Man unterscheidet zwischen– Breitentraversierung (breadth-first search, BFS): Die Knoten werden,

geordnet nach der "Entfernung" von einem Startknoten, durchlaufen• zuerst alle Knoten mit 1 Kantenlänge Abstand vom Startknoten• danach alle diejenigen Knoten mit Abstand 2, • danach die mit Abstand 3, usw.

– Tiefentraversierung (depth-first search, DFS): Dieser Algorithmus erhöht immer zuerst die Distanz vom Startknoten, bevor er in die Breite geht und Nachbarknoten mit gleicher Distanz besucht (meist rekursiv implementiert)

• Bereits besuchte Knoten müssen markiert werden, weil sich die Algorithmen sonst in den Kreisen des Graphen verlieren.

Node

+ loc:Location+ adjList+ visited:bool

+ Konstruktor:

Markierung

Page 9: FB Informatik Prof. Dr. R.Nitsch Programmieren 2 Future Car Projekt Praktikum 6 - Graphen Reiner Nitsch reiner.nitsch@h-da.de - Speichern von Graphen -

FB InformatikProf. Dr. R.Nitsch

09.10.2008 Projekt FutureCar 9

Tiefentraversierung (Rekursiv)

• Rekursiver Algorithmus (in Pseudocode), der ausgehend von einem unmarkierten Knoten vi, alle anderen Knoten vj, j!=i eines Graphen G besucht

Funktion: traverse-dfs(v) Zweck: Tiefensuche in einem GraphenParameter v: Knoten bei dem die Suche beginntPRE: --- POST: Alle Knoten, die von v erreichbar sind, sind gefunden.

Markiere v als besuchtBestimme einen Nachbarknoten von v und nenne diesen vnextWHILE(vnext existiert UND noch nicht besucht ist) beginne weitere Tiefensuche bei vnext Wieder zurück, bestimme weiteren Nachbarknoten von v und nenne diesen wieder vnextEND WHILE

Node

- loc:Location- adjList- visited:bool

+ Konstruktor:

procedure traverse-dfs(v) visited(v) := true vnext := adjList[v]

WHILE exist(vnext) AND NOT visited(vnext) traverse-dfs(vnext) vnext := succ(vnext)

END WHILEPseudocode (verbal)

Pseudocode (mnemonisch)

Page 10: FB Informatik Prof. Dr. R.Nitsch Programmieren 2 Future Car Projekt Praktikum 6 - Graphen Reiner Nitsch reiner.nitsch@h-da.de - Speichern von Graphen -

FB InformatikProf. Dr. R.Nitsch

09.10.2008 Projekt FutureCar 10

Beispiel zur (rekursiven) Tiefentraversierung

1

6

2

5

3

4

1

6

2

5

3

4

1

6

2

5

3

4

1

6

2

5

3

4

1

6

2

5

3

4

1

2

3

4

5

6

2

5

5

1

4

3

4

4

6

2

3

6

1

5

2

Adjazenzlisten von Seite 2

Alle Knoten und Kanten besucht!

Startknoten

1

2

3

4

5

6

1

6

2

5

3

4

1

6

2

5

3

4

1

6

2

5

3

4

1

6

2

5

3

4

1

6

2

5

3

4

1

5

2

4

4

6

2

3

6

2

5

5

1

4

3

Komplexität: O(|V|+|E|)

procedure traverse-dfs(v) visited(v) := true vnext := adjList[v] WHILE exist(vnext) AND NOT visited(vnext) traverse-dfs(vnext) vnext := succ(vnext) END WHILE

Page 11: FB Informatik Prof. Dr. R.Nitsch Programmieren 2 Future Car Projekt Praktikum 6 - Graphen Reiner Nitsch reiner.nitsch@h-da.de - Speichern von Graphen -

FB InformatikProf. Dr. R.Nitsch

09.10.2008 Projekt FutureCar 11

Tiefentraversierung (Iterativ)

• Iterativer Algorithmus mit einem Stack, der ausgehend von einer unmarkierten Ecke vi, alle anderen Knoten vj, j!=i eines Graphen G besucht

PRE: --- POST: Alle Ecken, die von v erreichbar sind, sind markiert.

procedure traverse-dfs(v) s := empty-stack // s ist ein lokaler Stack visited(v) := true // markiere v als besucht push(s,v) // lege v auf den Stack s

WHILE NOT empty(s) DO { v := top(s) // hole oberstes Element aus Stack s vnext := adjList[v] // hole ersten Nachbarknoten

WHILE exist(vnext) AND visited(vnext) DO // schon besucht? vnext := succ(vnext) // Ja! Dann eben den Nächsten END WHILE IF( exist(vnext) ) ) THEN // Noch einen Unbesuchten gefunden? visit(vnext) // diesen besuchen (und bearbeiten), visited(vnext) := true // als "besucht" markieren und push(s,vnext) // Erst mal auf den Stack damit ... ELSE DO pop(s) END IF END WHILE // Erledigt! Alle Nachbarn von v besucht}

… und hierschon wieder

runter!

Page 12: FB Informatik Prof. Dr. R.Nitsch Programmieren 2 Future Car Projekt Praktikum 6 - Graphen Reiner Nitsch reiner.nitsch@h-da.de - Speichern von Graphen -

FB InformatikProf. Dr. R.Nitsch

09.10.2008 Projekt FutureCar 12

Breitentraversierung

• Iterativer Algorithmus, der alle Knoten eines zusammenhängenden Graphen geordnet nach der Entfernung vom Startknoten s durchläuft.

– Zuerst werden alle vom Startknoten s über 1 Kante erreichbaren Knoten besucht– Danach alle über mindestens 2 Kanten erreichbaren Knoten, usw.– Entsteht formal aus Tiefentraversierung, wenn man den Stack durch eine Queue ersetzt.

PRE: ---Post: Alle Knoten, die von s erreichbar sind, sind markiert, also besucht wordenprocedure bfs_node(s) q := empty-queue // Definition einer leeren lokalen Queue q visited(s) := true // Startknoten s als "besucht" markieren enqueue(q,s) WHILE NOT empty(q) DO v := front(q) // vordersten Knoten in q lesen vnext := adjList[v] // hole ersten Nachbarknoten WHILE exist(vnext) AND visited(vnext) DO // schon besucht? vnext := succ(vnext) // Ja! Dann eben den Nächsten END WHILE IF exist(vnext) THEN // Noch einen Unbesuchten gefunden? visit(vnext) // diesen besuchen (und bearbeiten), visited(vnext) := true // als "besucht" markieren und enqueue(q,vnext) // erst mal in queue einreihen, wo sie bis zur

// Bearbeitung ihrer Nachbarknoten warten ELSE DO dequeue(q) // Erledigt! Alle Nachbarn von v mit gleichem END IF // Abstand vom Startknoten wurden besucht.END WHLE

Page 13: FB Informatik Prof. Dr. R.Nitsch Programmieren 2 Future Car Projekt Praktikum 6 - Graphen Reiner Nitsch reiner.nitsch@h-da.de - Speichern von Graphen -

FB InformatikProf. Dr. R.Nitsch

09.10.2008 Projekt FutureCar 13

1

6

2

5

3

4

1

6

2

5

3

4

1

6

2

5

3

4

1

6

3

4

procedure bfs_node(s) q := empty-queue visited(s) := true enqueue(q,s) WHILE NOT empty(q) DO v := front(q) vnext := adj[v] WHILE exist(vnext) AND visited(vnext) DO vnext := succ(vnext) END WHILE IF exist(vnext) THEN visit(vnext) visited(vnext) := true enqueue(q,vnext) ELSE dequeue(q) END IF END WHILE

Beispiel zur Breitentraversierung

1

6

2

5

3

4

1

6

2

5

3

4

Alle Knoten und Kanten besucht!

Startknoten

2

5

1

6

2

5

3

4

1

6

2

5

3

4

1

6

2

5

3

4

1

6

2

5

3

4

1

2

3

4

5

6

2

5

5

1

4

3

4

4

6

2

3

6

1

5

2

Adjazenzlisten von Seite 2

1

2

3

4

5

6

1

5

2

4

4

6

2

3

6

2

5

5

1

4

3 t:

Queue

2 5 4 1 3 6

Jetzt sind alle Knoten mit Distanz "1Kante" zum Startknoten besucht

Page 14: FB Informatik Prof. Dr. R.Nitsch Programmieren 2 Future Car Projekt Praktikum 6 - Graphen Reiner Nitsch reiner.nitsch@h-da.de - Speichern von Graphen -

FB InformatikProf. Dr. R.Nitsch

09.10.2008 Projekt FutureCar 14

Kürzeste Wege mittels Breitensuche

• Gesucht ist eine Verbindung (Pfad) zwischen 2 Knoten:– Tiefensuche liefert eine entsprechende Kantenfolge, wenn es eine gibt (aber

nicht unbedingt die Kürzeste).– Breitensuche liefert garantiert die Kürzeste.

• AufgabeMit Hilfe eines Breitensuchverfahrens soll der kürzeste Weg in einem ungewichteten Graphen G vom Startpunkt s zum Zielknoten d gefunden werden, der über die geringste Anzahl von Kanten verläuft. Dabei wird der Weg so codiert, dass man ihn hinterher rekonstruieren kann.

• Lösung– Die Breitentraversierung durchläuft alle Knoten geordnet nach der

Kantendistanz zu s. – Der Vorgängerknoten, von dem ausgehend der Knoten v betreten wird,

verbindet somit v auf dem kürzesten Wege mit s (keine Kantengewichte!).– Im Bearbeitungsschritt merkt sich Knoten v daher seinen Vorgängerknoten– Nachdem Knoten d betreten wurde und dieser sich seinen Vorgängerknoten

gemerkt hat, ist die Suche beendet.– Der kürzeste Weg, der d mit s verbindet, ergibt sich nun, indem man,

beginnend bei d, die Folge der Vorgängerknoten rekonstruiert. – Rückwärts gelesen (std::reverse) ergibt diese Folge den gesuchten

kürzesten Weg.

Page 15: FB Informatik Prof. Dr. R.Nitsch Programmieren 2 Future Car Projekt Praktikum 6 - Graphen Reiner Nitsch reiner.nitsch@h-da.de - Speichern von Graphen -

FB InformatikProf. Dr. R.Nitsch

09.10.2008 Projekt FutureCar 15

Breitensuche des Knotens d ausgehend vom Startknoten s

PRE: exist(s), exist(d)POST: Alle Knoten, die von v erreichbar sind, sind markiert, also besucht worden

FUNCTION bf_search(s,d) t := empty-queue // Definition einer leeren lokalen Queue visited(s) := true // Starknoten v als "besucht" markieren pred(s) := nil // s kennt seinen Vorgänger noch nicht enqueue(t,s) WHILE NOT empty(t) AND front(t)!=d DO // Abbruch der Suche wenn d besucht v := front(t) // vordersten Knoten in t lesen vnext := adj[v] // hole ersten Nachbarknoten WHILE exist(vnext) AND visited(vnext) DO vnext := succ(vnext) // Bereits besuchte Knoten überspringen END WHILE IF vnext != nil THEN // Solange unbesuchte Nachbarknoten zu v existieren visit(vnext) // diese besuchen (und bearbeiten), pred(v_next) := v // Vorgänger merken (besuchen & bearbeiten) visited(vnext) := true // als solche markieren und enqueue(t,vnext) // in queue einfügen, wo sie bis zur Bearbeitung

// ihrer Nachbarknoten warten ELSE DO dequeue(t) // entferne vorderstes Element aus t END IF // Alle Nachbarn dieses Knotens sind besucht IF empty(t) THEN { kein Pfad von s nach d }

Ergänzungen zum vorherigen Algorithmus sind ROT markiert

Node

- loc:Location- adjList- pred- visited:bool

+ Konstruktor:

Verweis auf Vorgängerknoten

21.12.12

Page 16: FB Informatik Prof. Dr. R.Nitsch Programmieren 2 Future Car Projekt Praktikum 6 - Graphen Reiner Nitsch reiner.nitsch@h-da.de - Speichern von Graphen -

FB InformatikProf. Dr. R.Nitsch

09.10.2008 Projekt FutureCar 16

Wegesuche in gewichtetem Graphen

Aufgaben– Von einem Knoten s aus die kürzesten Pfade zu allen anderen Knoten des

Graphen finden: Lösung mit single-source shortest path (SSSP) Algorithmen– Für alle Paare von Knoten die kürzesten Pfade finden: Lösung mit all-pair

shortest path (APSP) Algorithmen• Kürzeste Wege

– im ungewichteten Graph: Pfad mit geringster Kantenzahl– im gewichteten Graph: Pfad mit geringstem Gesamtgewicht

• Kürzeste Wege sind nicht eindeutig– wenn 2 Wege das gleiche Gesamtgewicht haben

• Kürzeste Wege existieren dann nicht– wenn gar kein Weg zwischen 2 Knoten existiert– falls der Graph Zyklen mit negativem Gesamtgewicht hat (jeder Durchlauf

verringert das Gewicht des Pfades.• Wichtige Algorithmen:

– Dijkstra-Algorithmus (SSSP): für Graphen mit Kantengewichten 0– Belman-Ford-Algorithmus: Für Graphen mit negativen Gewichten aber ohne

negative Zyklen (= Zyklen mit Kantensumme< 0).

Page 17: FB Informatik Prof. Dr. R.Nitsch Programmieren 2 Future Car Projekt Praktikum 6 - Graphen Reiner Nitsch reiner.nitsch@h-da.de - Speichern von Graphen -

FB InformatikProf. Dr. R.Nitsch

09.10.2008 Projekt FutureCar 17

Dijkstra Algorithmus

• Liefert für alle Knoten eines Graphen G die kürzesten Pfade zu einem Startknoten s• Wirkungsweise

– Zusätzlich zu seiner Adjazenzliste erhält jeder Knoten v die Angabe• zur minimalen Distanz d2s[v] von v zum

Startnoten s• des Vorgängerknotens pred[v] auf dem

kürzesten Weg zum Startknoten– Einfügen aller Knoten in eine Priorityqueue PQ– Mit jedem Durchlauf wird der Knoten mit

der bis dahin geringsten Distanz zu s aus einer PriorityQueue PQ entnommen (vmin ) und abschließend wie folgt bearbeitet:• die Distanz dneu der über vmin zu all seinen

Nachbarknoten führenden Wege wird ermit-telt wobei w(vmin,vnext) das Gewicht der Kante vmin->vnext ist.

• falls die bisher für vnext notierte Distanzgrößer als dneu ist, wird diese aktualisiert und vmin als neuer Vorgängerknoten eingetragen

Node

+ loc:Location+ adjList+ pred+ d2s:float

+ Konstruktor:

algorithm dijkstra(G,s) Eingabe: Graph G, Startknoten s FOR EACH Knoten v aus V(G) DO d2s[v]= pred[v]=nil OD d2s[s]=0 // Startknoten erhält höchste Priorität PQ:=V WHILE NOT empty(PQ) DO vmin = dequeueMin(PQ) // Für vmin ist der kürzeste Weg gefunden FOR EACH vnext OF vmin DO dneu:=d(vmin)+w(vmin,vnext)

IF dneu<d(vnext) DO d(vnext):=dneu pred:=vmin FI OD OD

Page 18: FB Informatik Prof. Dr. R.Nitsch Programmieren 2 Future Car Projekt Praktikum 6 - Graphen Reiner Nitsch reiner.nitsch@h-da.de - Speichern von Graphen -

FB InformatikProf. Dr. R.Nitsch

09.10.2008 Projekt FutureCar 18

Dijkstra-Algorithmus - Eigenschaften

• Mit jeder Iteration wird ein kürzester Pfad ermittelt und der jeweilige Zielknoten aus der Priorityqueue entfernt.

• Nach |V| Iterationen sind für alle Knoten die kürzesten Pfade zum Startknoten bekannt.