Vitajte na [www.pocitac.win] Pripojiť k domovskej stránke Obľúbené stránky
`` `Java
import java.util.*;
verejná trieda dijkstra {
verejná statická mapa
Map
Priorityqueue
// Inicializujte vzdialenosti na nekonečno, s výnimkou zdroja
pre (uzol uzol:graph.getNodes ()) {
vzdialenosť.put (uzol, Integer.max_value);
}
vzdialenosti.put (zdroj, 0);
MinHeap.add (zdroj);
while (! minheap.isempty ()) {
Uzol prúd =minheap.poll ();
pre (Edge Edge:Current.GetEdges ()) {
Uzol sused =Edge.getto ();
int DISTISTIL =DISTANCE.Get (current) + Edge.getweight ();
if (vzdialenosť
vzdialenosti.Put (sused, vzdialenosť);
Minheap.add (sused);
}
}
}
návratové vzdialenosti;
}
// HELRER TRIEDY pre reprezentáciu grafu
graf statickej triedy {
private set
public void addnode (uzol uzol) {
nodes.add (uzol);
}
public set
spätné uzly;
}
}
uzol statickej triedy {
Private String názov;
súkromný zoznam
public uzol (názov String) {
this.Name =name;
}
public String getName () {return name;}
public void pridané (Edge Edge) {
Edges.add (Edge);
}
public List
návratové hrany;
}
@Override
public boolean sa rovná (objekt obj) {
if (this ==obj) vráti true;
if (obj ==null || getClass ()! =obj.getClass ()) return false;
Uzol =(uzol) obj;
return objects.equals (name, node.name);
}
@Override
public int hashcode () {
return Objects.hash (meno);
}
}
statická hrana triedy {
súkromný uzol;
súkromná váha;
public Edge (uzol do, int váha) {
this.to =to;
this.weight =váha;
}
verejný uzol getto () {
Návrat k;
}
public int getweight () {
návrat;
}
}
public static void main (String [] args) {
Graf graf =nový graf ();
Uzol A =nový uzol ("A");
Uzol b =nový uzol ("b");
Uzol C =nový uzol ("C");
Uzol d =nový uzol ("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);
Map
pre (mapa
System.out.println ("Vzdialenosť od A do" + enadt.getKey (). GetName () + ":" + enadt.getValue ());
}
}
}
`` `
Vysvetlenie:
1. Predstavujú štruktúru grafu. Trieda „Node“ obsahuje zoznam svojich odchádzajúcich objektov `Edge.
2. `Dijkstra` funkcia: To implementuje Dijkstra algoritmus.
- Inicializuje `hashmap` (` vzdialenosti`) na ukladanie najkratších vzdialeností od zdrojového uzla do všetkých ostatných uzlov. Spočiatku sú všetky vzdialenosti nastavené na nekonečno, s výnimkou zdroja, ktorý je 0.
- „Priorityqueue“ sa používa ako ministerstvo financií na efektívny výber uzla s najmenšou vzdialenosťou. Porovnávač zaisťuje, že uzly sú usporiadané podľa ich vzdialeností.
- Algoritmus iteratívne odstraňuje uzol s najmenšou vzdialenosťou od haldy. Pre každého zo svojich susedov kontroluje, či sa nachádza kratšia cesta, a podľa toho aktualizuje vzdialenosť a hromadu. Operácie `remove` a` add` na `priorityqueue` udržiavajte vlastnosť haldy efektívne (logaritmický čas).
3. `main` funkcia: Tým sa vytvorí vzorový graf a volá funkciu `dijkstra`. Výsledok ukazuje najkratšiu vzdialenosť od uzla „A“ k všetkým ostatným uzlom.
Nezabudnite riešiť potenciálne problémy, ako sú negatívne hmotnosti okrajov (algoritmus Dijkstra s nimi nefunguje správne; namiesto toho by ste potrebovali algoritmus Bellman-Ford) a odpojené grafy. Tento vylepšený príklad spracováva `Equals` a` hashcode` v triede „Node`, aby správne spravoval spracovanie kľúčov„ Priorityqueue “a` Hashmap`.