Quelques propositions d'élèves, et à la fin un corrigé du professeur.
À la suite de chaque proposition de code, un commentaire de correction du professeur. Le cartouche demandé en introduction a été supprimé ici.
from collections import deque dictionnaire = dict() identifiant_station = int(input()) nombre_connexions = int(input()) def ajout_sommet(sommet): """ Permet d'ajotuer un sommet au dictionnaire >>> ajout_sommet(4) None >>> ajout_sommet(5) None """ if sommet in dictionnaire: return else: dictionnaire[sommet] = [] def ajout_flèche(sommet_1, sommet_2): """ Permet d'ajouter un arc orienté de `sommet_1` à `sommet_2` >>> ajout_flèche(9, 7) None >>> ajout_flèche(8, 4) None """ ajout_sommet(sommet_1) ajout_sommet(sommet_2) dictionnaire[sommet_1].append(sommet_2) def parcours_largeur(sommet_départ): """ Permet de renvoyer une liste avec le parcours en largeur à partir de `sommet_départ` """ file = deque() défile = file.popleft enfile = file.append déjà_parcouru = list() enfile(sommet_départ) déjà_parcouru.append(sommet_départ) while len(file) != 0: sommet = défile() for voisin in dictionnaire[sommet]: if voisin not in déjà_parcouru: enfile(voisin) déjà_parcouru.append(voisin) return déjà_parcouru for _ in range(nombre_connexions): sommet_1, sommet_2 = map(int, input().split(" ")) ajout_flèche(sommet_1, sommet_2) liste_parcours_largeur = parcours_largeur(identifiant_station) sommet_le_plus_éloigné = liste_parcours_largeur[len(liste_parcours_largeur)-1] def donne_liste_chemin(sommet_début, sommet_fin): """ Permet de donner la liste des chemins partant de `sommet_début` et `sommet_fin` """ liste_parcours_largeur.reverse() ensemble_chemin = {sommet_fin} dernier_sommet = sommet_fin for sommet in liste_parcours_largeur: if dernier_sommet in dictionnaire[sommet]: dernier_sommet = sommet ensemble_chemin.add(sommet) return ensemble_chemin longueur_chemin = len(donne_liste_chemin(identifiant_station, sommet_le_plus_éloigné)) -2 if longueur_chemin == 3 and identifiant_station != 3: print(dictionnaire, liste_parcours_largeur, sommet_le_plus_éloigné, identifiant_station,) else: print(longueur_chemin)
""" auteur : Franck CHAMBON https://prologin.org/train/2003/semifinal/plan_de_metro """ def main(): départ = int(input()) nb_liens = int(input()) # construction du graphe graphe = dict() for _ in range(nb_liens): station_a, station_b = map(int, input().split()) for _ in range(2): if station_x not in graphe: graphe[station_x] = [station_y] else: graphe[station_x].append(station_y) station_a, station_b = station_b, station_a # parcours en largeur en partant de départ, # avec calcul de la distance maximale atteinte courant = {départ} vus = {départ} distance = 0 while courant != set(): suivant = set() for station_a in courant: for station_b in graphe[station_a]: if station_b not in vus: suivant.add(station_b) vus.add(station_b) courant = suivant distance += 1 print(distance - 2) # on enlève 2. # 1 pour le dernier ajout de 1 à vide, # 1 autre pour le nombre de station intermédiaire au lieu de la distance. main()
Il suffit de construire le graphe, et d'en faire un parcours en largeur depuis départ
.
Il faut penser aussi à créer de petits fichiers tests avec une boucle en fin de course. Comme le suivant, où la sortie attendue est 0
.
1
3
1 2
2 3
1 3
Exercice : réécrire ce code avec un style POO.