Untitled
unknown
java
3 years ago
3.1 kB
11
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...