Untitled
unknown
java
2 years ago
3.1 kB
7
Indexable
public Integer route(net.datastructures.Graph<String, Integer> graph, PublicTransit[] publicTransit, String from, String to, int time) { // d.get(v) is upper bound on distance from from to v java.util.Map<net.datastructures.Vertex<String>, Integer> map = new HashMap<>(); // map reachable v to its d value java.util.Map<net.datastructures.Vertex<String>, Integer> cloud = new HashMap<>(); HashMap<net.datastructures.Vertex, net.datastructures.Vertex> previousNode = new HashMap<>(); // pq will have vertices as elements, with d.get(v) as key net.datastructures.AdaptablePriorityQueue<Integer, net.datastructures.Vertex<String>> priorityQueue; priorityQueue = new net.datastructures.HeapAdaptablePriorityQueue<>(); // maps from vertex to its pq locator Map<net.datastructures.Vertex<String>, net.datastructures.Entry<Integer, net.datastructures.Vertex<String>>> pqTokens; pqTokens = new HashMap<>(); // for each vertex v of the graph, add an entry to the priority queue, with // the source having distance 0 and all others having infinite distance for (net.datastructures.Vertex<String> vertex : graph.vertices()) { if (vertex.getElement().equals(from)) map.put(vertex,0); else map.put(vertex, Integer.MAX_VALUE); pqTokens.put(vertex, priorityQueue.insert(map.get(vertex), vertex)); // save entry for future updates } // now begin adding reachable vertices to the cloud while (!priorityQueue.isEmpty()) { net.datastructures.Entry<Integer, net.datastructures.Vertex<String>> entry = priorityQueue.removeMin(); int key = entry.getKey(); net.datastructures.Vertex<String> entryValue = entry.getValue(); if (entryValue.getElement().equals(to)) { return key; } cloud.put(entryValue, key); // this is actual distance to u pqTokens.remove(entryValue); // u is no longer in pq for (net.datastructures.Edge<Integer> edge : graph.outgoingEdges(entryValue)) { net.datastructures.Vertex<String> vertex = graph.opposite(entryValue, edge); if (cloud.get(vertex) == null) { // perform relaxation step on edge (u,v) int edgeElement = edge.getElement(); if (map.get(entryValue) + edgeElement < map.get(vertex)) { // better path to v? map.put(vertex, map.get(entryValue) + edgeElement); // update the distance previousNode.put(entryValue, vertex); priorityQueue.replaceKey(pqTokens.get(vertex), map.get(vertex)); // update the pq entry } } } } return null; // not reachable }
Editor is loading...