Adloun

Corrigé Mines-Ponts 2026 Informatique II MPI — Partie 2 (2.3) (Q20 à Q23) : Parcours en largeur et Dijkstra initialisé par le parcours

Sujet officiel du concours Mines-Ponts, session 2026, épreuve Informatique II MPI. Corrigé rédigé par Ibrahim Alame.

Sujet officiel (PDF, site du concours)

Énoncé

Le monde, représenté en CSR (partie précédente), est supposé fortement connexe ; les coûts des passages sont strictement positifs. On dispose, sans avoir à les écrire, d'une file FIFO d'entiers (file_init(n) crée une file vide de capacité n) et d'un tas min de salles munies d'une priorité entière (tasMin_depile retire et renvoie une salle de priorité minimale) :


typedef struct _file file;
file* file_init(int taille);
bool  file_vide(file *f);
void  file_enfile(file *f, int x);
int   file_defile(file *f);
void  file_libere(file *f);

typedef struct _tasMin tasMin;
tasMin* tasMin_init(void);
bool    tasMin_vide(tasMin *tm);
void    tasMin_empile(tasMin *tm, int salle, int priorite);
int     tasMin_depile(tasMin *tm);
void    tasMin_libere(tasMin *tm);

Q20. Expliquer comment un parcours en largeur depuis s fournit, pour chaque salle t, un chemin de nombre minimal de passages ; donner un cas où ces chemins sont aussi de coût minimal.
Q21. Écrire int* bfs_cout(mondeCSR* mc, int s), qui renvoie un tableau dist (alloué dynamiquement, de taille mc->nb_salles) où dist[u] est la somme des coûts le long du chemin à nombre minimal de passages trouvé par le parcours en largeur de s à u.
Q22. Expliquer pourquoi dist[u] majore le coût minimal d'un chemin de s à u.
Rappel : Dijkstra part d'un tableau dist rempli de et explore le graphe depuis s à l'aide d'une file de priorité ; un sommet découvert u y est inséré avec la priorité dist[u], et les sommets sont explorés dans l'ordre de sortie de la file. Ici, dist est initialisé par bfs_cout(mc, s) au lieu de , et l'on traite tous les sommets (pas de sommet d'arrivée).
Q23. Écrire void dijkstra(mondeCSR* mc, int s, int* dist), qui transforme le tableau dist calculé par bfs_cout(mc, s) en le tableau des coûts minimaux depuis s (sans reconstruire les chemins).

Corrigé

Les deux fonctions ont été compilées (gcc -Wall -Wextra -std=c99, sans avertissement) et exécutées avec une file et un tas binaire écrits pour le test : sur le graphe de Q12 depuis chacune des cinq salles (depuis : dist , déjà minimal) ; sur un graphe où le parcours en largeur ne donne pas le coût minimal (ci-dessous) ; sur un monde d'une seule salle ; enfin sur graphes aléatoires fortement connexes de à salles, soit sources, comparés à Floyd-Warshall : aucune erreur, et jamais plus de insertions dans le tas. Aucune fuite mémoire (leaks).

Q20. Le parcours en largeur range les salles à traiter dans une file. On attribue à s le niveau et on l'enfile ; tant que la file n'est pas vide, on défile une salle et chaque salle atteinte par un passage et pas encore découverte reçoit le niveau , le « père » , et est enfilée. Chaque salle est découverte au plus une fois, et toutes le sont puisque le monde est fortement connexe. En remontant les pères depuis , on obtient un chemin de à de passages. Montrons que est le nombre minimal de passages d'un chemin de à .

Un cas de coût minimal : si tous les passages ont le même coût , un chemin de passages coûte , donc minimiser le coût revient à minimiser le nombre de passages. (Autre cas : un monde réduit à un circuit , où chaque salle n'est atteinte depuis s que par un seul chemin sans répétition de salle.)

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 →