getEdges() {
retourranden;
}
@Overschrijven
public boolean is gelijk aan (Object obj) {
if (dit ==obj) retourneert waar;
if (obj ==null || getClass() !=obj.getClass()) retourneert false;
Knooppunt knooppunt =(knooppunt) obj;
return Objects.equals(naam, knooppunt.naam);
}
@Overschrijven
openbare int hashCode() {
return Objects.hash(naam);
}
}
statische klasse Rand {
privé knooppunt naar;
privé int gewicht;
public Edge(knooppunt naar, int gewicht) {
dit.to =naar;
dit.gewicht =gewicht;
}
openbaar knooppunt getTo() {
terugkeren naar;
}
public int getWeight() {
retourgewicht;
}
}
public static void main(String[] args) {
Grafiekgrafiek =nieuwe grafiek();
Knooppunt a =nieuw knooppunt("A");
Knooppunt b =nieuw knooppunt("B");
Knooppunt c =nieuw knooppunt("C");
Knooppunt d =nieuw knooppunt("D");
a.addEdge(nieuwe Rand(b, 4));
a.addEdge(nieuwe Rand(c, 2));
b.addEdge(nieuwe Rand(c, 1));
b.addEdge(nieuwe rand(d, 5));
c.addEdge(nieuwe Rand(d, 8));
grafiek.addNode(a);
grafiek.addNode(b);
grafiek.addNode(c);
grafiek.addNode(d);
Kaart afstanden =dijkstra(grafiek, a);
for (Map.Entry invoer:distances.entrySet()) {
System.out.println("Afstand van A tot " + entry.getKey().getName() + ":" + entry.getValue());
}
}
}
```
Uitleg:
1. `Graph`, `Node`, `Edge` klassen: Deze vertegenwoordigen de grafiekstructuur. De klasse `Node` bevat een lijst met de uitgaande `Edge`-objecten.
2. `dijkstra`-functie: Hiermee wordt het algoritme van Dijkstra geïmplementeerd.
- Het initialiseert een `HashMap` (`distances`) om de kortste afstanden van het bronknooppunt naar alle andere knooppunten op te slaan. Aanvankelijk zijn alle afstanden ingesteld op oneindig, behalve de bron, die 0 is.
- Een `PriorityQueue` wordt gebruikt als een min-heap om efficiënt het knooppunt met de kleinste afstand te selecteren. De comparator zorgt ervoor dat knooppunten worden geordend op afstand.
- Het algoritme verwijdert iteratief het knooppunt met de kleinste afstand van de heap. Voor elk van zijn buren controleert het of er een korter pad is gevonden en werkt de afstand en de hoop dienovereenkomstig bij. De bewerkingen `remove` en `add` op de `PriorityQueue` behouden de heap-eigenschap efficiënt (logaritmische tijd).
3. `hoofd`-functie: Hierdoor wordt een voorbeeldgrafiek gemaakt en wordt de functie 'dijkstra' aangeroepen. Het resultaat toont de kortste afstand van knooppunt "A" tot alle andere knooppunten.
Vergeet niet om potentiële problemen zoals negatieve randgewichten (het algoritme van Dijkstra werkt er niet goed mee; je hebt in plaats daarvan het Bellman-Ford-algoritme nodig) en niet-verbonden grafieken te behandelen. Dit verbeterde voorbeeld verwerkt `equals` en `hashCode` in de klasse `Node` om de sleutelafhandeling van `PriorityQueue` en `HashMap` correct te beheren.