org.bbottema.javareflection.util.graph.Dijkstra Maven / Gradle / Ivy
package org.bbottema.javareflection.util.graph;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Map.Entry;
import java.util.Set;
@SuppressWarnings("unused")
final class Dijkstra {
private Dijkstra() {
}
@SuppressWarnings("WeakerAccess")
public static void findShortestPathToAllOtherNodes(Node startingPoint) {
startingPoint.setCost(0);
Set> settledNodes = new HashSet<>();
Set> unsettledNodes = new HashSet<>();
unsettledNodes.add(startingPoint);
while (unsettledNodes.size() != 0) {
Node currentNode = getLowestDistanceNode(unsettledNodes);
unsettledNodes.remove(currentNode);
for (Entry, Integer> adjacencyPair : currentNode.getToNodes().entrySet()) {
Node adjacentNode = adjacencyPair.getKey();
if (!settledNodes.contains(adjacentNode)) {
Integer edgeWeight = adjacencyPair.getValue();
calculateMinimumDistance(adjacentNode, edgeWeight, currentNode);
unsettledNodes.add(adjacentNode);
}
}
settledNodes.add(currentNode);
}
}
private static void calculateMinimumDistance(Node evaluationNode, Integer edgeWeigh, Node sourceNode) {
if (sourceNode.getCost() + edgeWeigh < evaluationNode.getCost()) {
evaluationNode.setCost(sourceNode.getCost() + edgeWeigh);
LinkedList> shortestPath = new LinkedList<>(sourceNode.getLeastExpensivePath());
shortestPath.add(sourceNode);
evaluationNode.setLeastExpensivePath(shortestPath);
}
}
private static Node getLowestDistanceNode(Set> unsettledNodes) {
Node lowestDistanceNode = null;
int lowestDistance = Integer.MAX_VALUE;
for (Node node : unsettledNodes) {
if (node.getCost() < lowestDistance) {
lowestDistance = node.getCost();
lowestDistanceNode = node;
}
}
return lowestDistanceNode;
}
}