class File:
    def __init__(self):
        "initialise une file vide"
        self.elements = []
        
    def consulter(self):
        """
        renvoie le premier élément disponible sans le retirer de la file
        lève une exception IndexError si la file est vide
        """
        if not self.est_vide():
            return self.elements[0]
        else:
            raise IndexError("La file est vide.")
    
    def est_vide(self):
        """
        renvoie True si la file est vide, False sinon
        """
        return len(self.elements) == 0
        
    def extraire(self):
        """
        renvoie le premier éléement disponible et le retire de la file
        lève une exception IndexError si la file est vide
        """
        if not self.est_vide():
            return self.elements.pop(0)
        else:
            raise IndexError("La file est vide.")
        
    
    def inserer(self, element):
        """
        ajoute l'élément donné dans la file
        """
        self.elements.append(element)

def dico_distance(graphe,  depart):
    """ graphe : dictionnaire
        {sommet : liste de sommets adjacents}
        depart : un sommet du graphe
        renvoie un dictionnaire
        {sommet atteignable depuis depart :
        distance entre depart et ce sommet}"""
    
    # initialisation d'une file
    file = File()
    file.inserer(depart)
    
    # initialisation du dictionnaire de sortie
    dico = {depart: 0}
    
    while not file.est_vide():
        # extraire le prochain sommet à explorer
        sommet = file.extraire()
        # pour chaque voisin encore non atteint
        for voisin in graphe[sommet]:
            if voisin not in dico:
                # attribuer la distance à ce voisin
                dico[voisin] = dico[sommet] + 1
                # placer ce voisin dans la file 
                # pour exploration future
                file.inserer(voisin)
    return dico

def excentricite(graphe, sommet):
    """ graphe : dictionnaire
        {sommet : liste de sommets adjacents}
        renvoie l'excentricité du sommet
        dans le graphe (int) """
    dico = dico_distance(graphe, sommet)
    # m = 0
    # for distance in dico.values():
    #     if distance > m:
    #         m = distance
    # return m
    # ou
    # m = 0
    # for s in dico:
    #     if dico[s] > m:
    #         m = dico[s]
    # return m
    # 
    # mieux pour la dernière question :
    m = 0
    for sommet, distance in dico.items():
        if sommet[0] != 'P' and distance > m:
            m = distance
    return m


# Question 9

graphe = {
    'V': ['M'],
    'M': ['V', 'P2', 'P3'],
    'P2': ['M', 'A', 'C'],
    'P3': ['M', 'A'],
    'A': ['P2', 'P3', 'P1'],
    'P1': ['A', 'C'],
    'C': ['P1', 'P2']
}

# Question 11
print(dico_distance(graphe,  'P1'))

# Question 14
for sommet in graphe:
    if sommet[0] == 'P':
        print(f"Excentricité de {sommet} : {excentricite(graphe, sommet)}")
