Corrigé Centrale 2025 Informatique MPI — Partie B, I (couplages) (Q22 à Q29) : Couplage maximum : chemins augmentants, Hopcroft-Karp (OCaml)
Sujet officiel du concours Centrale, session 2025, épreuve Informatique MPI. Corrigé rédigé par Ibrahim Alame.
Sujet officiel (PDF, site du concours)
Énoncé
, graphe des cases d'un terrain (arêtes entre cases adjacentes), est biparti : noires , blanches . Il est donné par g : int list array (listes d'adjacence) et p. Un couplage est représenté par conjoint : int option array : None si est libre, Some y (et Some x en ) si , sont conjoints. Un chemin est la liste [x0; ...; xk] ; il est élémentaire si ses sommets sont distincts, alternant s'il est élémentaire et que ses arêtes alternent entre et , augmentant s'il est alternant à extrémités libres. .
Q22. Si est augmentant pour , est un couplage.
Q23. delta (conjoint : int option array) (w : int list) : unit remplace par ( augmentant).
: mêmes sommets ; pour chaque arête (, ), l'arc si , l'arc sinon. , : sommets libres de , de .
type couplage = {
graphe : int list array;
p : int;
conjoint : int option array;
}
Q24. Un chemin de avec , est augmentant si et seulement si est un chemin de .
Q25. oriente (c : couplage) : int list array renvoie .
: plus petite longueur d'un chemin alternant d'un à (, codé max_int, s'il n'y en a pas) ; : longueur d'un plus court chemin augmentant (max_int s'il n'y en a pas).
type distance = {
d : int array;
dmin : int;
}
Q26. distance (c : couplage) : distance, avec le module Queue (create, push, pop, is_empty).
On cherche des chemins augmentants de longueur sans sommet commun : garde les arcs de tels que ; depuis chaque , un parcours en profondeur de cherche un chemin vers , dont on retire les sommets. On ne construit pas .
exception Chemin of int list
let ensemble_hc (c : couplage) (dist : distance) : int list list =
let r = Array.length c.graphe in
let visite = Array.make r false in
let go = oriente c in
let ensemble = ref [] in
let rec chemin (x : int) (w : int list) : unit =
<code1>
in
<code2>
!ensemble
Q27. <code1> : parcours en profondeur dans depuis , le chemin déjà parcouru étant à l'envers ; lever Chemin w quand un chemin augmentant est trouvé.
Q28. <code2>.
Q29. Avec le lemme de Berge (admis), écrire couplage_maximum (g : int list array) (p : int) : int option array.
Corrigé
Tout le code OCaml a été exécuté (OCaml 5.4) : sur les terrains de la figure 4 et de Q19 à Q21, sur la grille , sur un sommet isolé, puis sur terrains aléatoires (jusqu'à ) et graphes bipartis aléatoires, où le cardinal obtenu coïncide toujours avec celui de l'algorithme élémentaire du livre (chapitre 24) et où le résultat est vérifié être un couplage (conjoint symétrique, arêtes du graphe, une extrémité dans ).
Q22. Soit augmentant. Comme est libre, l'arête n'est pas dans ; par alternance, les arêtes sont hors de et les arêtes dans ; comme est libre, la dernière arête est hors de , et est impair. s'obtient en retirant de les arêtes et en ajoutant les arêtes . Comptons, pour chaque sommet , les arêtes de dont il est extrémité.
- n'est pas sur : aucune arête de ne le touche, ses arêtes dans sont celles de : au plus une.
- avec : le chemin étant élémentaire, apparaît une seule fois, et exactement deux arêtes de le touchent, et , l'une dans et l'autre non. Son unique arête de est donc sur et disparaît ; seule l'autre arête de en est ajoutée. Il est extrémité d'exactement une arête.
- ou : libre dans , il gagne la seule arête de qui le touche : exactement une.
est donc un couplage, et ( a une arête de plus hors de que dans ).
Q23. D'après Q22, les nouvelles paires de conjoints sont , et chaque sommet de en fait partie : il suffit de les écrire, les anciens partenaires étant écrasés.
let rec delta (conjoint : int option array) (w : int list) : unit =
match w with
| x :: y :: suite ->
conjoint.(x) <- Some y;
conjoint.(y) <- Some x;
delta conjoint suite
| _ -> ()
Tout sommet de reçoit son nouveau conjoint, et ses anciennes valeurs (un conjoint pris sur , d'après Q22) sont remplacées ; les sommets hors de ne sont pas touchés, et leurs conjoints sont hors de . La liste ayant éléments, nombre pair, le filtrage consomme deux sommets à chaque appel et finit sur la liste vide. Récursivité terminale, coût . La liste renversée [xk; ...; x0] donnerait les mêmes paires, puisque est pair. Exécuté : le couplage et le chemin [0; 3; 1; 4] donnent [|Some 3; Some 4; None; Some 0; Some 1|].
Q24. Ce que le correcteur attend : le rapport du jury signale une erreur d'énoncé : il faut supposer le chemin élémentaire, car un chemin de peut repasser par un sommet. Par exemple, si et sont dans , et , libres, est un chemin de (avec les arêtes , , , hors de ) qui n'est pas augmentant. On montre donc : un chemin élémentaire de à est augmentant si et seulement si est un chemin de .
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é.