Adloun

Corrigé Banque PT 2025 Informatique et modélisation PT — Partie G (Q44 à Q48) : Plus court chemin : dictionnaire d'adjacence et algorithme de Dijkstra

Sujet officiel du concours Banque PT, session 2025, épreuve Informatique et modélisation PT. Corrigé rédigé par Ibrahim Alame.

Sujet officiel (PDF, site du concours)

Énoncé

Les lieux sont les sommets (numérotés) d'un graphe pondéré ; le poids d'une arête est la distance entre deux lieux.

Figure 13 — Exemple de graphe pondéré.

Q44. Compléter le dictionnaire d'adjacence commencé par \{0: [(1,5), (2,6)], 1: [(0,5), (3,8), (4,3)], 2: [(0,6), (4,1), (5,9)], …\}. Pourquoi est-il préférable ici à une matrice d'adjacence ? Quelle méthode (3 à 4 phrases) fait la rapidité d'accès des dictionnaires ?

Algorithme ( sommets) : liste distances initialisée à 0 pour le départ et à (infini) ailleurs ; liste deja_visites de booléens False. Tant que deja_visites contient un False : en_cours est le sommet non visité de plus petite distance ; on le marque visité, puis, pour chaque voisin non visité, on remplace sa distance par le minimum de l'ancienne et de distance(en_cours) plus le poids de l'arête.

Q45. États successifs de distances depuis le sommet 0.
Q46. Écrire sommet_min(dist, deja_visites) : indice du minimum de dist parmi les sommets non visités de distance différente de , ou None s'il n'y en a pas.
Q47. Écrire actualiser(k, dist, deja_visites, g) : met à jour les deux listes en visitant le sommet k du graphe g (dictionnaire d'adjacence).
Q48. Écrire dijkstra(g, depart) renvoyant la liste des distances minimales depuis depart.

Corrigé

Q44. Chaque arête non orientée apparaît dans les listes de ses deux extrémités, avec son poids :


g = {0: [(1, 5), (2, 6)],
     1: [(0, 5), (3, 8), (4, 3)],
     2: [(0, 6), (4, 1), (5, 9)],
     3: [(1, 8), (4, 2), (5, 4)],
     4: [(1, 3), (2, 1), (3, 2), (5, 7)],
     5: [(2, 9), (3, 4), (4, 7)]}

On contrôle la cohérence : arêtes, donc couples au total (), et chaque couple de la liste de a son symétrique dans celle de .

Pourquoi un dictionnaire d'adjacence ? Le graphe est peu dense : arêtes pour paires possibles, chaque sommet ayant 2 à 4 voisins. Une matrice d'adjacence occuperait cases, la plupart vides (un réseau routier réel compte des millions de sommets de degré 3 ou 4 : la matrice serait gigantesque et presque vide). Le dictionnaire n'occupe qu'une place proportionnelle à nombre d'arêtes, et il donne directement la liste des voisins d'un sommet, ce que fait Dijkstra à chaque visite (au lieu de parcourir une ligne entière de cases).

Le hachage. Un dictionnaire Python est une table de hachage. Une fonction de hachage transforme chaque clé en un entier, qui sert à calculer directement l'indice de la case d'un tableau où la valeur est rangée. L'accès à la valeur associée à une clé ne demande donc aucun parcours : il se fait en temps constant en moyenne, . Les collisions (deux clés envoyées dans la même case) sont rares si la table est assez grande et sont gérées par le langage ; c'est pourquoi les clés doivent être non mutables (entiers, chaînes, tuples). Ce que le correcteur attend : le mot « hachage », peu cité dans les copies.

100 % gratuit

La suite du corrigé est sur Adloun

Le corrigé rédigé en entier, question par question, et le tuteur pour poser des questions sur ce sujet.

Voir le corrigé complet, gratuitement

Inscription gratuite en 30 secondes (e-mail, nom d'utilisateur, mot de passe, classe ou profil), sans carte bancaire : arrivée directe sur le corrigé.

Toutes les parties de l'épreuve

Corrigé complet gratuit →