class Dijkstra {

	public static long neighbourhood(HierarchyMapGraph graph, int startnode, byte level, boolean forward) throws Exception{
		
		if (graph == null) throw new EmptyInputException("Leerer Graph uebergeben");
		if (graph.getNode(startnode) == null) throw new InvalidInputException("Ungueltige ID uebergeben");
		
		int found = -1; //erster Knoten, der gefunden wird, ist der Startknoten, dieser wird nicht mitgezaehlt bei der Anzahl der Nachbarschaftsknoten
		final HashMap<Integer,Vertex> nodes = new HashMap<Integer,Vertex>(); //Liste in der alle besuchten Knoten gespeichert werden.
		final PrQueue queue = new PrQueue(); //Priority Queue, die alle erreichbaren Knoten enthaelt
		
		final Vertex start = new Vertex(graph.getNode(startnode),0); //Vertex ist die Hilfsklasse, in der zusaetzliche Infos ueber Knoten gespeichert werden.
		nodes.put(startnode, start);
		
		queue.insert(start);
		
		while (queue.getSize() != 0){
			final Vertex node = queue.extractMin();
			final HierarchyMapNode realNode = (HierarchyMapNode) node.node;

			found++;
			if (found == Config.H) return node.getDist(); //Abbruchbedingung erfuellt
			
			Iterator <HierarchyMapEdge> edges = null;

			if (forward){
				edges = realNode.getOutgoingEdgesByHierarchy(level).iterator();
			}else{
				edges = realNode.getIncomingEdgesByHierarchy(level).iterator();
			}
						
			while (edges.hasNext()){ //ueberpruefe alle benachbarten Knoten
				final HierarchyMapEdge newEdge = edges.next();
				updateNeighbours(nodes, queue, newEdge, node, forward);

			}
		} return -1; //wenn man bis hier kommt, gibt es keine H erreichbaren Knoten
	}

}