`` `Java
import java.util.*;
Classe pubblica Dijkstra {
Mappa statica pubblica
Mappa
PriorityQueue
// inizializza le distanze all'infinito ad eccezione della fonte
per (nodo nodo:graph.getNodes ()) {
Distances.put (nodo, integer.max_value);
}
Distances.put (fonte, 0);
MinHeap.Add (fonte);
while (! minHeap.isempty ()) {
Nodo corrente =minHeap.Poll ();
per (Edge Edge:current.getEdges ()) {
Nodo vicino =edge.getto ();
int distance =distances.get (corrente) + edge.getWeight ();
if (distance
Distances.put (vicino, distanza);
MinHeap.Add (vicino);
}
}
}
distanze di ritorno;
}
// Classi di supporto per la rappresentazione del grafico
grafico della classe statica {
set privato
public void addNode (nodo nodo) {
nodi.add (nodo);
}
public set
restituire nodi;
}
}
nodo di classe statica {
Nome stringa privato;
Elenco privato
nodo pubblico (nome stringa) {
this.name =name;
}
public String getName () {return name;}
public void addge (edge edge) {
Edges.add (Edge);
}
Public List
bordi di ritorno;
}
@Override
Public Boolean Equals (Object Obj) {
if (this ==obj) restituisce vero;
if (obj ==null || getClass ()! =obj.getclass ()) restituisce false;
Nodo nodo =(nodo) obj;
return objects.quals (name, node.name);
}
@Override
public int hashCode () {
restituire oggetti.hash (nome);
}
}
Classe statica Edge {
nodo privato a;
Peso privato int;
Public Edge (nodo a, int peso) {
this.to =to;
this.weight =peso;
}
nodo pubblico getTo () {
tornare a;
}
public int getweight () {
Restituire il peso;
}
}
public static void main (string [] args) {
Grafico grafico =new graph ();
Nodo a =nuovo nodo ("a");
Nodo b =nuovo nodo ("b");
Nodo c =nuovo nodo ("c");
Nodo d =nuovo nodo ("d");
A.Addedge (new Edge (B, 4));
A.Addedge (new Edge (C, 2));
B.ADDEDge (new Edge (C, 1));
B.AdDedge (new Edge (d, 5));
C.AddEdge (New Edge (d, 8));
Graph.addNode (a);
Graph.addNode (b);
Graph.addNode (c);
Graph.addNode (d);
Mappa
for (map.entry
System.out.println ("Distanza da a a" + entry.getKey (). GetName () + ":" + entry.getValue ());
}
}
}
`` `
Spiegazione:
1. `Graph`,` Node`, `Edge` Classi: Questi rappresentano la struttura del grafico. La classe `Node` include un elenco dei suoi oggetti` Edge 'in uscita.
2. `Dijkstra` Funzione: Ciò implementa l'algoritmo di Dijkstra.
- inizializza un `hashmap` (` distances`) per archiviare le distanze più brevi dal nodo di origine a tutti gli altri nodi. Inizialmente, tutte le distanze sono impostate su Infinity ad eccezione della fonte, che è 0.
- Un `priorityQueue` viene utilizzato come Min-heap per selezionare in modo efficiente il nodo con la distanza più piccola. Il comparatore garantisce che i nodi siano ordinati dalle loro distanze.
- L'algoritmo rimuove iterativamente il nodo con la distanza più piccola dal mucchio. Per ciascuno dei suoi vicini, controlla se viene trovato un percorso più breve e aggiorna la distanza e il mucchio di conseguenza. Le operazioni `Rimuovi` e` Aggiungi` sul `priorityQueue` mantengono in modo efficiente la proprietà heap (tempo logaritmico).
3. `Funzione principale: Questo crea un grafico di esempio e chiama la funzione `Dijkstra`. Il risultato mostra la distanza più breve dal nodo "A" a tutti gli altri nodi.
Ricorda di gestire potenziali problemi come i pesi di bordo negativo (l'algoritmo di Dijkstra non funziona correttamente con loro; invece avresti bisogno dell'algoritmo Bellman-Ford) e grafici disconnessi. Questo esempio migliorato gestisce `uguali` e` hashcode` nella classe `nodo` per gestire correttamente la gestione della chiave di` priorityqueue 'e `hashmap'.
Informazioni correlate
Programmazione © www.354353.com