public Result run(Node start, Node end) {
		if(start==null || end==null) throw new IllegalArgumentException("Start or end node not provided");
		
		/*System.out.println("-------- Dijkstra Mono-Objectif ---------");
		System.out.println("On cherche le plus court du " + start + " vers le " + end);*/
		
		// Initialize algorithm
		long startTime = System.currentTimeMillis();
		init(start);
		
		Node toExplore = null;
		while(toExplore!=end) { // While we didn't explore the end node yet
			toExplore = findNextNode(end); // Pick the node to explore (which has the minimum combination value)
			if(toExplore==null) throw new IllegalStateException("No node to explore has been found.");
			
			//System.out.println("Exploration: "+toExplore);
			
			// Node has been explored, add it as explored and remove it from opened list
			closedList.add(toExplore);
			openedList.remove(toExplore);
						
			// For each successor
			for(Link succ : toExplore.getLinks()) {
				//System.out.println("- Etude du successeur: "+succ.getNoeud());
				//System.out.println("-- Ancienne Distance vers: "+succ.getNoeud()+" <= " + dist.get(succ.getNoeud()));
				
				// Invalid node ?
				if(succ.getNode()==null) throw new IllegalStateException("The explored node is invalid.");
				
				// If the opened list doesn't contain the successor node, add it
				if(!openedList.contains(succ.getNode()) && !closedList.contains(succ.getNode())) openedList.add(succ.getNode());
				
				if(succ.getDistance()+distances.get(toExplore) < distances.get(succ.getNode())) {
					// New shortest path found
					//System.out.println("-- Nouvelle Distance vers: "+succ.getNoeud()+" <= " + dist.get(succ.getNoeud()));
					distances.put(succ.getNode(), (succ.getDistance()+distances.get(toExplore)));
					bestNextNode.put(succ.getNode(), toExplore);
				} else {
					// Use previous path
					distances.put(succ.getNode(), distances.get(succ.getNode()));
				}
			}
			//System.out.println();
		}
		
		long endTime = System.currentTimeMillis();
		/*System.out.println("Temps d'éxécution: "  + (float)(end-start) + " ms");
		System.out.println("-----------------------------------------\n");*/
		
		ArrayList<Path> c = new ArrayList<Path>();
		c.add(backtrack(start, end));
		return new Result(g, start, end, (endTime-startTime), c);
	}