package id.ac.itats.skripsi.shortestpath.engine; import id.ac.itats.skripsi.shortestpath.model.Edge; import id.ac.itats.skripsi.shortestpath.model.Graph; import id.ac.itats.skripsi.shortestpath.model.Vertex; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.PriorityQueue; public class Dijkstra { public void computePaths(Graph graph, Vertex source) { if (! graph.hasClearTree) { graph.clearTree(); } System.out.println(source); source.minDistance = 0.; PriorityQueue<Vertex> vertexQueue = new PriorityQueue<Vertex>(); vertexQueue.add(source); while (!vertexQueue.isEmpty()) { Vertex u = vertexQueue.poll(); // Visit each edge exiting u for (Edge e : u.adjacencies) { Vertex v = e.target; double weight = e.weight; double distanceThroughU = u.minDistance + weight; if (distanceThroughU < v.minDistance) { vertexQueue.remove(v); v.minDistance = distanceThroughU; v.previous = u; vertexQueue.add(v); } } } graph.hasClearTree = false; } public List<Vertex> getShortestPathTo(Vertex target) { List<Vertex> path = new ArrayList<Vertex>(); for (Vertex vertex = target; vertex != null; vertex = vertex.previous) path.add(vertex); Collections.reverse(path); return path; } }