Adloun

Problème — Le plus court trajet dans un réseau de métro

Application directe du cours · niveau 1 (application) · NSI (terminale), chapitre 4 — Les graphes

Énoncé

Problème — Le plus court trajet dans un réseau de métro.

Un réseau de métro relie des stations. On le modélise par un graphe non orienté metro (listes d'adjacence). Écrire une fonction trajet(metro, depart, arrivee) qui affiche le plus court trajet (en nombre de stations) et indique le nombre de changements minimal de lignes, en supposant un réseau non pondéré (toutes les liaisons comptent pour 1).

Corrigé

Le réseau étant non pondéré, le plus court trajet en nombre de stations s'obtient par un BFS mémorisant les prédécesseurs, comme pour le plus court chemin en nombre d'arêtes vu plus haut. On réutilise cette logique et on renvoie la liste des stations traversées.


from collections import deque

def trajet(metro, depart, arrivee):
    if depart == arrivee:
        return [depart]
    predecesseur = {depart: None}
    file = deque([depart])
    while file:
        station = file.popleft()
        for suivante in metro[station]:
            if suivante not in predecesseur:
                predecesseur[suivante] = station
                if suivante == arrivee:
                    chemin = [arrivee]
                    while predecesseur[chemin[-1]] is not None:
                        chemin.append(predecesseur[chemin[-1]])
                    chemin.reverse()
                    return chemin
                file.append(suivante)
    return None

metro = {
    "Chatelet":   ["Louvre", "Gare", "Bastille"],
    "Louvre":     ["Chatelet", "Concorde"],
    "Concorde":   ["Louvre", "Etoile"],
    "Etoile":     ["Concorde"],
    "Gare":       ["Chatelet"],
    "Bastille":   ["Chatelet", "Nation"],
    "Nation":     ["Bastille"],
}
print(trajet(metro, "Etoile", "Nation"))
# ['Etoile', 'Concorde', 'Louvre', 'Chatelet', 'Bastille', 'Nation']

Le BFS garantit le trajet de longueur minimale en nombre de stations. La complexité est . Pour modéliser des durées différentes entre stations ou pénaliser les changements de ligne, il faudrait passer à un graphe pondéré et employer l'algorithme de Dijkstra, généralisation pondérée du BFS.

Les autres exercices de ce chapitre Le cours du chapitre

Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.