`` `java
Εισαγωγή java.util.*;
δημόσια τάξη dijkstra {
δημόσιος στατικός χάρτης <κόμβος, ακέραιος> dijkstra (γράφημα γραφήματος, πηγή κόμβου) {
Χάρτης <κόμβος, ακέραιος> αποστάσεις =νέο HashMap <> ();
PriorityQueue
// αρχικοποιήστε τις αποστάσεις στο άπειρο εκτός από την πηγή
για (κόμβος κόμβου:graph.getNodes ()) {
αποστάσεις.put (κόμβος, integer.max_value);
}
αποστάσεις.put (πηγή, 0);
minheap.add (πηγή);
ενώ (! minHeap.isempty ()) {
Ρεύμα κόμβου =minHeap.poll ();
για (άκρη:current.getEdges ()) {
NODE γείτονας =EDGE.getto ();
int distance =αποστάσεις.get (ρεύμα) + Edge.getweight ();
αν (απόσταση
αποστάσεις.put (γείτονας, απόσταση);
minheap.add (γείτονας);
}
}
}
αποστάσεις επιστροφής ·
}
// μαθήματα βοηθητικού για εκπροσώπηση γραφημάτων
Στατικό γράφημα κλάσης {
ιδιωτικό σετ <κόμβου> κόμβους =νέο hashset <> ();
δημόσιο κενό addNode (κόμβος κόμβου) {
nodes.add (κόμβος);
}
δημόσιο σύνολο
κόμβοι επιστροφής ·
}
}
Στατικός κόμβος κλάσης {
ιδιωτικό όνομα συμβολοσειράς.
Ιδιωτική λίστα
δημόσιος κόμβος (όνομα συμβολοσειράς) {
this.name =όνομα;
}
δημόσια συμβολοσειρά getName () {επιστροφή όνομα;}
Public Void Addingge (Edge Edge) {
Edges.add (άκρη);
}
Δημόσια λίστα
επιστροφή άκρων.
}
@Καταπατώ
Το δημόσιο boolean ισούται (αντικείμενο obj) {
αν (αυτό ==obj) επιστρέψει true?
αν (obj ==null || getClass ()! =obj.getClass ()) επιστροφή false;
Κόμβος κόμβου =(κόμβος) obj;
Επιστροφή αντικειμένων.Equals (όνομα, node.name);
}
@Καταπατώ
δημόσιο int hashcode () {
επιστροφή αντικειμένων.hash (όνομα);
}
}
Στατική κατηγορία άκρη {
ιδιωτικός κόμβος σε?
ιδιωτικό βάρος int;
δημόσιο πλεονέκτημα (κόμβος, int βάρος) {
this.to =to;
this.weight =βάρος;
}
δημόσιος κόμβος getto () {
επιστροφή στο?
}
δημόσιο int getweight () {
βάρος επιστροφής ·
}
}
δημόσιο στατικό κενό κύριο (String [] args) {
Γράφημα γραφήματος =νέο γράφημα ();
Κόμβος a =νέος κόμβος ("a");
Κόμβος b =νέος κόμβος ("b");
Κόμβος C =νέος κόμβος ("C");
Κόμβος d =νέος κόμβος ("d");
a.addedge (νέα άκρη (b, 4));
a.addedge (νέα άκρη (C, 2));
B.Addedge (νέα άκρη (C, 1)).
B.Addedge (νέα άκρη (d, 5));
C.addedge (νέα άκρη (d, 8));
graph.addnode (a);
graph.addnode (b);
graph.addnode (c);
graph.addnode (d);
Χάρτης <κόμβος, ακέραιος> αποστάσεις =dijkstra (γράφημα, α);
για το (map.Entry
System.out.println ("Απόσταση από a σε" + entry.getKey () getName () + ":" + entry.getValue ());
}
}
}
`` `
Επεξήγηση:
1. Αυτά αντιπροσωπεύουν τη δομή γραφημάτων. Η κλάση "Node` περιλαμβάνει μια λίστα με τα εξερχόμενα αντικείμενα" Edge ".
2. Αυτό υλοποιεί τον αλγόριθμο του Dijkstra.
- αρχικοποιεί ένα `hashmap` (` αποστάσεις ') για να αποθηκεύσει τις συντομότερες αποστάσεις από τον κόμβο πηγής σε όλους τους άλλους κόμβους. Αρχικά, όλες οι αποστάσεις έχουν οριστεί σε άπειρο εκτός από την πηγή, η οποία είναι 0.
- Ένα `PriorityQueue` χρησιμοποιείται ως μιναίτη για να επιλέξει αποτελεσματικά τον κόμβο με τη μικρότερη απόσταση. Ο συγκριτής εξασφαλίζει ότι οι κόμβοι διατάσσονται από τις αποστάσεις τους.
- Ο αλγόριθμος απομακρύνει επαναληπτικά τον κόμβο με τη μικρότερη απόσταση από το σωρό. Για καθένα από τους γείτονές του, ελέγχει εάν βρίσκεται μια μικρότερη διαδρομή και ενημερώνει την απόσταση και τον σωρό ανάλογα. Οι λειτουργίες `remove` και` `asd 'στο' PriorityQueue 'διατηρούν αποτελεσματικά την ιδιότητα Heap (λογαριθμικός χρόνος).
3. `main 'λειτουργία: Αυτό δημιουργεί ένα δείγμα γραφήματος και καλεί τη λειτουργία `dijkstra '. Το αποτέλεσμα δείχνει τη συντομότερη απόσταση από τον κόμβο "Α" σε όλους τους άλλους κόμβους.
Θυμηθείτε να χειριστείτε πιθανά ζητήματα όπως τα αρνητικά βάρη άκρων (ο αλγόριθμος του Dijkstra δεν λειτουργεί σωστά μαζί τους, θα χρειαστείτε τον αλγόριθμο Bellman-Ford αντ 'αυτού) και αποσυνδεδεμένα γραφήματα. Αυτό το βελτιωμένο παράδειγμα χειρίζεται το `Equals` και το` hashcode 'στην κλάση' Node 'για να διαχειριστεί σωστά το βασικό χειρισμό' PriorityQueue 'και' Hashmap`.
Πνευματικά δικαιώματα © Γνώση Υπολογιστών Όλα τα δικαιώματα κατοχυρωμένα