Corrigé CCINP 2025 Informatique MPI — Partie III (III.3) (Q32 à Q38) : Gale-Shapley et graphe des premiers choix en C
Sujet officiel du concours CCINP, session 2025, épreuve Informatique MPI. Corrigé rédigé par Ibrahim Alame.
Sujet officiel (PDF, site du concours)
Énoncé
Les individus sont numérotés et . Deux matrices donnent les préférences : Lv[i][j] est le -ième élément de préféré par , Lu[i][j] le -ième élément de préféré par . La taille est une constante de compilation, #define n 4, et les matrices sont déclarées dans main par int Lv[n][n], Lu[n][n];. III.3.1. Rang[i][j] est le rang (depuis ) de dans la liste de .
Q32. void calcule_rang(int Lu[n][n], int Rang[n][n]) construit Rang.
CoupleV[i] et CoupleU[i] donnent le partenaire actuel de ; USuiv[i] est, pour , le rang du prochain élément de auquel il peut proposer.
Q33. Valeurs d'initialisation de ces trois tableaux.
Q34. void gale_shapley(int Lv[n][n], int Lu[n][n], int CoupleU[n], int CoupleV[n]) réalise l'algorithme 3 en remplissant CoupleU et CoupleV ; le qui propose est à chaque fois le premier libre par numéro croissant.
III.3.2. Pour l'algorithme 4, les sommets sont numérotés , , et le graphe (arc de chaque individu vers son premier choix) est codé par listes d'adjacence :
struct noeud {
int individu; // Element de U union V
struct noeud* suivant;
};
typedef struct noeud *liste;
struct graphe_s {
int nb_sommets;
liste *liste_adjacence;
};
typedef struct graphe_s graphe;
Q35. void ajoute_arc(graphe *g, int i, int j) ajoute l'arc .
Q36. void supprime_arc(graphe *g, int i, int j) supprime l'arc .
Q37. void supprime_sommet(graphe *g, int s) supprime tous les arcs d'origine ou de destination .
Q38. graphe *construit_graphe(int Lv[n][n], int Lu[n][n]) construit , en prenant garde à la numérotation de .
Corrigé
Toutes les fonctions utilisent la constante n du #define et supposent <stdlib.h> inclus (malloc, free).
Q32. L'élément Lu[i][j] de occupe le rang dans la liste de : on « inverse » chaque ligne de Lu.
void calcule_rang(int Lu[n][n], int Rang[n][n]) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
Rang[i][Lu[i][j]] = j; /* Lu[i][j] est au rang j pour i */
}
}
}
Chaque ligne Lu[i] étant une permutation de , chaque case Rang[i][x] est écrite exactement une fois, avec le rang de . Coût . Ensuite, « préfère à » se teste en par Rang[u][v] < Rang[u][w]. Sur (avec numérotés ), les lignes de Rang valent , , : par exemple classe au rang , au rang , au rang .
Q33. Au départ, personne n'est apparié et chaque n'a encore proposé à personne :
CoupleV[i] = -1etCoupleU[i] = -1pour tout : n'est le numéro d'aucun individu et code « libre » ;USuiv[i] = 0pour tout : le prochain élément auquel propose est celui de rang , son préféréLv[i][0].
Ce que le correcteur attend : USuiv contient un rang dans la ligne Lv[i], pas un individu ; l'initialiser avec une case de Lu ou de Rang est l'erreur relevée par le jury.
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, gratuitementInscription gratuite en 30 secondes (e-mail, nom d'utilisateur, mot de passe, classe ou profil), sans carte bancaire : arrivée directe sur le corrigé.