// Path: core/src/com/odysseedesmaths/pathfinding/util/PriorityQueue.java
// public class PriorityQueue<E> {
// 
//     private Map<E,Integer> queue;
// 
//     public PriorityQueue() {
//         queue = new HashMap<E,Integer>();
//     }
// 
//     public E get() {
//         E res = null;
//         Integer lowest = Integer.MAX_VALUE;
// 
//         for (Map.Entry<E,Integer> entry : queue.entrySet()) {
//             int priority = entry.getValue();
//             if (priority < lowest) {
//                 res = entry.getKey();
//                 lowest = priority;
//             }
//         }
// 
//         queue.remove(res);
//         return res;
//     }
// 
//     public void put(E e, Integer p) {
//         queue.put(e,p);
//     }
// 
//     public boolean isEmpty() {
//         return queue.isEmpty();
//     }
// 
//     public boolean contains(E e) {
//         return queue.keySet().contains(e);
//     }
// 
// }


import com.odysseedesmaths.pathfinding.util.PriorityQueue;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
package com.odysseedesmaths.pathfinding;



/**
 * Implémentation basique de quelques algorithmes permettant de calculer des chemins dans un {@link Pathfindable}.
 */
public abstract class Pathfinding {

    /**
     * Algorithme de Dijkstra.<br>
     * Permet de calculer les chemins d'un sommet vers tous les autres sommets du graphe.<br>
     * Les chemins peuvent être extraits de la map des prédécesseurs avec {@link #buildPath(Map, Object, Object) buildPath}.
     * @param <E>       le type des objets contenus dans le Pathfindable
     * @param g         l'ensemble d'objet dans lequel rechercher les chemins
     * @param start     le sommet de départ
     * @param dist      la map des distances relatives au sommet de départ (<strong>contenu précédent perdu</strong>)
     * @param came_from la map des prédécesseurs de chaque sommet sur le chemin pour se rendre au point de départ (<strong>contenu précédent perdu</strong>)
     */
    public static <E> void dijkstraAll(Pathfindable<E> g, E start, Map<E, Integer> dist, Map<E, E> came_from) {
        // Nettoyage et initialisation des map
        dist.clear();
        came_from.clear();
        dist.put(start, 0);
        came_from.put(start, null);

        // Liste priorisée des sommets à traiter, initialisée avec le départ
// Path: core/src/com/odysseedesmaths/pathfinding/util/PriorityQueue.java
// public class PriorityQueue<E> {
// 
//     private Map<E,Integer> queue;
// 
//     public PriorityQueue() {
//         queue = new HashMap<E,Integer>();
//     }
// 
//     public E get() {
//         E res = null;
//         Integer lowest = Integer.MAX_VALUE;
// 
//         for (Map.Entry<E,Integer> entry : queue.entrySet()) {
//             int priority = entry.getValue();
//             if (priority < lowest) {
//                 res = entry.getKey();
//                 lowest = priority;
//             }
//         }
// 
//         queue.remove(res);
//         return res;
//     }
// 
//     public void put(E e, Integer p) {
//         queue.put(e,p);
//     }
// 
//     public boolean isEmpty() {
//         return queue.isEmpty();
//     }
// 
//     public boolean contains(E e) {
//         return queue.keySet().contains(e);
//     }
// 
// }


// Path: core/src/com/odysseedesmaths/pathfinding/Pathfinding.java
import com.odysseedesmaths.pathfinding.util.PriorityQueue;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;

package com.odysseedesmaths.pathfinding;



/**
 * Implémentation basique de quelques algorithmes permettant de calculer des chemins dans un {@link Pathfindable}.
 */
public abstract class Pathfinding {

    /**
     * Algorithme de Dijkstra.<br>
     * Permet de calculer les chemins d'un sommet vers tous les autres sommets du graphe.<br>
     * Les chemins peuvent être extraits de la map des prédécesseurs avec {@link #buildPath(Map, Object, Object) buildPath}.
     * @param <E>       le type des objets contenus dans le Pathfindable
     * @param g         l'ensemble d'objet dans lequel rechercher les chemins
     * @param start     le sommet de départ
     * @param dist      la map des distances relatives au sommet de départ (<strong>contenu précédent perdu</strong>)
     * @param came_from la map des prédécesseurs de chaque sommet sur le chemin pour se rendre au point de départ (<strong>contenu précédent perdu</strong>)
     */
    public static <E> void dijkstraAll(Pathfindable<E> g, E start, Map<E, Integer> dist, Map<E, E> came_from) {
        // Nettoyage et initialisation des map
        dist.clear();
        came_from.clear();
        dist.put(start, 0);
        came_from.put(start, null);

        // Liste priorisée des sommets à traiter, initialisée avec le départ
        PriorityQueue<E> toDo = new PriorityQueue<E>();