Adloun

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 :

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, 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 →