private static Map<Integer, List<Edge>> buildGraph(List<Edge> edges) { Map<Integer, List<Edge>> graph = new TreeMap<>(); for (Edge edge : edges) { if (!graph.containsKey(edge.getStartNode())) { graph.put((Integer) edge.getStartNode(), new ArrayList<Edge>()); } graph.get(edge.getStartNode()).add(edge); if (!graph.containsKey(edge.getEndNode())) { graph.put((Integer) edge.getEndNode(), new ArrayList<Edge>()); } Edge reversedEdge = new Edge(edge.getEndNode(), edge.getStartNode(), edge.getWightl()); graph.get(edge.getEndNode()).add(reversedEdge); } return graph; }
public Set<NodeEdgePair> getAdjecents() { // Set<Edge> edges = getEdges(); Set<NodeEdgePair> nodes = new HashSet<>(); for (Edge e : edges) { Node start = e.getStartNode(); Node end = e.getEndNode(); Node other = start == this ? end : start; nodes.add(new NodeEdgePair(e, other)); } return nodes; }
// Dosn't work like dijkstra. Work like kruskal private static void dijkstra(List<Edge> edges, int startingNode) { Map<Integer, List<Edge>> graph = buildGraph(edges); // use reverse order priority queue PriorityQueue<Edge> priorityQueue = new PriorityQueue<Edge>(); boolean[] visitedNode = new boolean[graph.size()]; int[] parent = new int[graph.size()]; int[] distance = new int[graph.size()]; // initialize the parent and distance array for (int i = 0; i < distance.length; i++) { distance[i] = Integer.MAX_VALUE; parent[i] = -1; } visitedNode[startingNode] = true; parent[startingNode] = startingNode; distance[startingNode] = 0; do { // TODO List<Edge> childOfStartingtNode = graph.get(startingNode); for (Edge edge : childOfStartingtNode) { if (!edge.isConnected()) { priorityQueue.add(edge); } } Edge currentEdge = priorityQueue.poll(); currentEdge.setConnected(true); if (!visitedNode[currentEdge.getEndNode()]) { visitedNode[currentEdge.getEndNode()] = true; parent[currentEdge.getEndNode()] = currentEdge.getStartNode(); int newDistance = distance[currentEdge.getStartNode()] + currentEdge.getWightl(); if (distance[currentEdge.getEndNode()] > newDistance) { distance[currentEdge.getEndNode()] = newDistance; } startingNode = currentEdge.getEndNode(); } } while (priorityQueue.size() > 0); for (int i = 0; i < graph.size(); i++) { System.out.println("Node: " + i); System.out.println("distance: " + distance[i]); System.out.println("Parent: " + parent[i]); System.out.println(); } }