Untitled

 avatar
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...