Knoten: Wanderer zwischen den Welten Implementierung in Java Knoten eines Graphs Warteschlangenelement Datenstruktur für den Dijkstra-Algorithmus 2 Knoten eines Graphs Kante eines Graphs Attribute Attribute Name Zielknoten der Kante Kanten (als Liste) Entfernung zum Zielknoten über diese Kante 3 4 Knoten Kante + knoten: Knoten + name: String + kanten: Kante[] + entfernung: int (c) Knoten(n: String, e: int) (c) Kante(k: Knoten, entf: int) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 1 2 3 4 5 6 7 8 9 10 p u b l i c c l a s s Kante { p u b l i c Knoten z i e l k n o t e n ; public int entfernung ; } p u b l i c Kante ( Knoten knoten , i n t e n t f e r n u n g ) { t h i s . z i e l k n o t e n = knoten ; this . entfernung = entfernung ; } Warteschlangenelement p u b l i c c l a s s Knoten { p u b l i c S t r i n g name ; p u b l i c Kante [ ] k a n t e n = new Kante [ 1 0 ] ; Attribute private int kantenanzahl = 0; p u b l i c Knoten ( S t r i n g name ) { t h i s . name = name ; } } p u b l i c v o i d f u e g e K a n t e H i n z u ( Kante k t ) { t h i s . kanten [ kantenanzahl ] = kt ; this . kantenanzahl = this . kantenanzahl + 1; } entfernung (als Gewicht) Verweis auf den Nachfolger in der Warteschlange Methoden Einfügen eines Knotens Entfernen eines Knotens Ausgabe des Restes Warteschlange 8 Knoten Kante Knoten Kante + name: String + name: String + knoten: Knoten + kanten: Kante[] + knoten: Knoten + kanten: Kante[] + entfernung: int + entfernung: int + entfernung: int + entfernung: int (c) Kante(k: Knoten, entf: int) + nachfolger: Knoten (c) Kante(k: Knoten, entf: int) (c) Knoten(n: String, e: int) (c) Knoten(n: String, e: int) + fuegeKnotenEin(k: Knoten) Warteschlange - kopf: Knoten + nachfolger: Knoten + fuegeKnotenEin(k: Knoten) Warteschlange + entferneKnoten(k: Knoten) - kopf: Knoten + gibRestWarteschlangeAus() (c) Warteschlange() (c) Warteschlange() + fuegeKnotenEin(k: Knoten) + fuegeKnotenEin(k: Knoten) + entferneKnoten(k: Knoten) + entferneKnoten(k: Knoten) + gibErstesElementZurueck(): Knoten + gibErstesElementZurueck(): Knoten + gibWarteschlangeAus() + gibWarteschlangeAus() + entferneKnoten(k: Knoten) + gibRestWarteschlangeAus() Datenstruktur für den Dijkstra-Algorithmus Übung Attribute Verweis auf den Vorgänger im Pfad Methoden 1. Implementieren Sie die fehlenden Methoden der Muster-Implementierung 2. Testen Sie das Verhalten der Warteschlange mit Beispieldaten Expandieren eines Knotens benötigt die aktuelle Warteschlange als Parameter Ausgabe des resultierenden Pfades (kürzester Weg) 12 Knoten Kante Knoten Kante + name: String + name: String + knoten: Knoten + kanten: Kante[] + knoten: Knoten + kanten: Kante[] + entfernung: int + entfernung: int + entfernung: int + entfernung: int (c) Kante(k: Knoten, entf: int) + nachfolger: Knoten (c) Kante(k: Knoten, entf: int) + vorgaengerImPfad: Knoten + vorgaengerImPfad: Knoten + istMarkiert: boolean Warteschlange - kopf: Knoten (c) Warteschlange() + fuegeKnotenEin(k: Knoten) + entferneKnoten(k: Knoten) + gibErstesElementZurueck(): Knoten + nachfolger: Knoten + istMarkiert: boolean (c) Knoten(n: String, e: int) Warteschlange + fuegeKnotenEin(k: Knoten) - kopf: Knoten + entferneKnoten(k: Knoten) (c) Warteschlange() + gibRestWarteschlangeAus() + fuegeKnotenEin(k: Knoten) + expandiereKnoten(ws: Warteschlange) + entferneKnoten(k: Knoten) + gibPfadAus() + gibErstesElementZurueck(): Knoten (c) Knoten(n: String, e: int) + fuegeKnotenEin(k: Knoten) + entferneKnoten(k: Knoten) + gibRestWarteschlangeAus() + expandiereKnoten(ws: Warteschlange) + gibPfadAus() + gibWarteschlangeAus() + gibWarteschlangeAus() Die Hauptklasse der Anwendung Übung Muss zu Beginn den Graph erzeugen kennt Start- und Zielknoten der Suche 1. Implementieren Sie die fehlenden Methoden der Muster-Implementierung berechnet den kürzesten Weg 16 Knoten Kante + name: String + knoten: Knoten + kanten: Kante[] + entfernung: int + entfernung: int + nachfolger: Knoten (c) Kante(k: Knoten, entf: int) + vorgaengerImPfad: Knoten + istMarkiert: boolean (c) Knoten(n: String, e: int) Warteschlange Algorithmus + fuegeKnotenEin(k: Knoten) - kopf: Knoten + startknoten: Knoten + entferneKnoten(k: Knoten) (c) Warteschlange() + zielknoten: Knoten + gibRestWarteschlangeAus() + fuegeKnotenEin(k: Knoten) + graph: Kanten[] + expandiereKnoten(ws: Warteschlange) + entferneKnoten(k: Knoten) (c) Algorithmus() + gibErstesElementZurueck(): Knoten + berechneWeg() + gibWarteschlangeAus() + gibPfadAus() + main() Algorithmus + startknoten: Knoten + zielknoten: Knoten + graph: Kanten[] (c) Algorithmus() + berechneWeg() + main() Übung 1. Implementieren Sie die Methode berechneWeg(Warteschlange ws) der Klasse Algorithmus 2. Testen Sie die fertige Anwemdung anhand von minimalen Eingabedaten