diff --git a/07/src/main/java/ch/zhaw/ads/DijkstraNode.java b/07/src/main/java/ch/zhaw/ads/DijkstraNode.java index 3650bc9..9e1cb69 100644 --- a/07/src/main/java/ch/zhaw/ads/DijkstraNode.java +++ b/07/src/main/java/ch/zhaw/ads/DijkstraNode.java @@ -30,7 +30,6 @@ class DijkstraNode extends Node implements Comparable { } public int compareTo(DijkstraNode n) { - // TODO: implement - return 0; + return Double.compare(this.dist, n.getDist()); } } diff --git a/07/src/main/java/ch/zhaw/ads/RouteServer.java b/07/src/main/java/ch/zhaw/ads/RouteServer.java index 653f2c5..2a05537 100644 --- a/07/src/main/java/ch/zhaw/ads/RouteServer.java +++ b/07/src/main/java/ch/zhaw/ads/RouteServer.java @@ -1,17 +1,23 @@ package ch.zhaw.ads; import java.util.Scanner; +import java.util.Queue; +import java.util.PriorityQueue; public class RouteServer implements CommandExecutor { + Graph graph; @Override public String execute(String command) { - Graph graph = this.readInput(command); + graph = this.readInput(command); StringBuffer result = new StringBuffer(100); for (Node node : graph.getNodes()) { result.append(node.getName() + "\n"); } result.append("\"\n"); + + + this.dijkstra("Winterthur", "Lugano"); return result.toString(); } @@ -37,4 +43,42 @@ public class RouteServer implements CommandExecutor { scanner.close(); return graph; } + + private void dijkstra(String from, String to) { + Queue pq = new PriorityQueue(); + DijkstraNode start = graph.findNode(from); + DijkstraNode goal = graph.findNode(to); + start.setDist(0); + pq.add(start); + while (!pq.isEmpty()) { + DijkstraNode current = pq.poll(); + current.setMark(true); + // implement equals for this + // if (current.equal(goal)) { + if (current.getName() == to) { + break; + } + for (Edge edge : current.getEdges()) { + DijkstraNode sucessor = edge.getDest(); + if (!sucessor.getMark()) { + double dist = edge.getWeight() + current.getDist(); + if (sucessor.getPrev() == null || dist < sucessor.getDist()) { + sucessor.setDist(dist); + sucessor.setPrev(current); + pq.add(sucessor); + } + } + } + } + + System.out.println("\n\nShortest path:\n"); + // print the shortest path + DijkstraNode current = goal; + while (current.getPrev() != null) { + System.out.println(current.getName()); + current = current.getPrev(); + } + System.out.println(current.getName()); + System.out.println("\n\n"); + } }