public Path shortestPath(Vertex start, Vertex end) {
		checkVertexExists(start);
		checkVertexExists(end);
	 	DHeap<Vertex> pq = new DHeap<Vertex>(2);
		Map<Vertex, Vertex> prevMap = new HashMap<Vertex, Vertex>(); /* v_k -> v_k+1 if
					v_k+1 is the previous vertex on the shortest path to v_k */
		for (Vertex v : graph.keySet()) {
			if (v.equals(start))
				v.setCost(0);
			else
				v.setCost(Integer.MAX_VALUE);
			pq.insert(v);
		}
		Vertex current = pq.deleteMin(); // current.equals(start) here
		while(!pq.isEmpty() && !current.equals(end)) {
			for(Edge e : graph.get(current)) { 
				if (pq.contains(e.getDestination())) { /* if pq does not contain the 
						destination vertex, the shortest path to that vertex is known. */ 
					Vertex destination = pq.get(e.getDestination()); /* must do get() to get 
							corresponding Vertex within pq */
					if (current.getCost() + e.getWeight() < destination.getCost()) {
						destination.setCost(current.getCost() + e.getWeight());
						prevMap.put(destination, e.getSource());
						pq.decreaseKey(destination, e.getWeight() + current.getCost());
					}
				}
			}
			/* the minimum value in pq is the vertex with the cheapest cost from start
					of the unknown vertices */
			Vertex next = pq.deleteMin();
			current = next;
		}
		return getBackpointPath(prevMap, start, current);
	}