Centrale Option Informatique MP 2021Sujet, corrigé et rapport du jury
- Programmation en Caml : listes, tableaux, références
- Graphes : représentation, connexité, parcours
- Arbres et arbres couvrants
- Structure union-find
- Complexité des algorithmes
- Algorithmes probabilistes
Téléchargements
Présentation du sujet
DifficileArbres couvrants et pavages aléatoires d'un échiquier par des dominosAfficher ou masquer la section
Présentation du sujet
DifficileLe sujet construit un pavage aléatoire d'un échiquier par des dominos grâce à une bijection avec les arbres couvrants d'un graphe quadrillage. Il demande d'abord des fonctions Caml générales sur les graphes, puis des preuves sur les arbres et une structure de partition (union-find). Il implémente ensuite l'algorithme de Wilson de génération d'un arbre couvrant aléatoire, relie pavages et arbres couvrants et utilise le graphe dual pour réaliser la bijection.
- 1Partie I : quelques fonctions auxiliairesReprésentation d'un graphe, tableaux d'adjacence en temps linéaire et construction du graphe quadrillage.
- 2Partie II : caractérisation des arbresComposantes connexes, plus courts chemins, nombre d'arêtes d'un arbre et structure de partition par forêt avec union selon la hauteur.
- 3Partie III : algorithme de WilsonGénération aléatoire d'un arbre couvrant, terminaison de l'algorithme et implémentation.
- 4Partie IV : arbres couvrants et pavages par des dominosCorrespondance sur des exemples entre pavage et arbre couvrant, puis calcul de l'arbre associé à un pavage.
- 5Partie V : utilisation du dual pour la construction d'un pavageGraphe dual d'un graphe planaire, arbres couvrants duaux, conversions de représentations et construction du pavage.
Difficile. Le jury juge le sujet très long : peu de candidats ont pu aborder les parties IV et V, même si de rares copies ont tout traité correctement.
L'épreuve en chiffres
Moyenne 9 / 20 · écart-type 4,18 · 1 723 présents · où vous situez-vous ?Afficher ou masquer la section
L'épreuve en chiffres
- Moyenne
- 9/ 20
- Écart-type
- 4,18
- Présents
- 1 723
- Coefficient
- 10
- Durée
- 4 h
- 1er quartile
- 6
- Médiane
- 8,8
- 3e quartile
- 12,1
Votre note sur 20 à ce sujet, en conditions de concours.
Source : document officiel du concours, épreuve du 21 avril 2021. Notes publiées par le concours (après harmonisation le cas échéant). Courbe : estimation par une loi normale.
Ce qu'a observé le jury
6 erreurs relevéesRéférences et listes mal manipulées · Parenthèses oubliées · Filtrage mal utiliséAfficher ou masquer la section
Ce qu'a observé le jury
6 erreurs relevéesLa programmation en Caml est globalement acquise par une majorité de candidats, avec une maîtrise parfois superficielle de la syntaxe. Les raisonnements théoriques sont en revanche souvent incomplets, avec des étapes jugées évidentes. Le jury relie ces difficultés aux conditions sanitaires des deux années de préparation.
Les erreurs les plus sanctionnées
- 1Références et listes mal manipulées
Oubli du !, usage de = ou <- au lieu de :=, et tentative d'ajouter des éléments à une liste dans une boucle alors qu'une liste n'est pas modifiable.
« une nouvelle liste est créée à chaque passage dans la boucle, puis oubliée au passage suivant »
- 2Parenthèses oubliées
f n - 1 ne calcule pas f (n - 1), et une instruction placée après un if ... else suivi d'un point-virgule est toujours exécutée.
- 3Filtrage mal utilisé
Un motif comme y - 1 dans un match provoque une erreur : il faut une garde when. Renommer inutilement les variables dans un filtrage alourdit le code.
- 4Code trop longQ6
Une réponse de plus d'une page avec plusieurs fonctions auxiliaires non expliquées obtient rarement la moitié des points ; en Q6, inutile de traiter séparément coins, bords et centre.
- 5Preuves superficiellesQ8 à Q10
Des formules comme « on voit que » ne suffisent pas : un graphe connexe d'ordre n a au moins n − 1 arêtes se démontre. En Q8, le caractère non vide de l'ensemble est indispensable.
« une preuve formée uniquement de symboles et de flèches sans explications n'obtiendra aucun point dans la majorité des cas »
- 6Structure de données mal compriseQ12, Q18
En Q12, les arguments sont déjà des représentants et la hauteur doit être mise à jour. En Q18, la structure dispensait de gérer les cycles, ce que très peu ont vu.
Ce qui a été bien réussi
- La programmation en Caml est globalement acquise pour une majorité de candidats.
- De rares candidats ont traité correctement l'intégralité de l'épreuve.
Conseils du jury
- Utiliser les fonctions autorisées comme List.length, List.rev ou Array.init au lieu de les réécrire.
- Préférer une boucle for à une fonction récursive auxiliaire quand c'est plus simple, en se rappelant que les deux bornes sont atteintes.
- Indenter et aérer le code pour le rendre lisible.
- Formaliser les preuves en expliquant les notations.
- S'entraîner régulièrement à programmer sur ordinateur pendant l'année.
Synthèse rédigée par WikiPrépa à partir du rapport officiel du jury (à télécharger en PDF). Les citations sont extraites du rapport.
Ces sujets peuvent vous intéresser
Lecture du sujet en ligne
L'énoncé complet, avec les formules et les figures, sans ouvrir le PDF.Afficher ou masquer la section
Lecture du sujet en ligne
Option informatique
Arbres couvrants et pavages
Toutes les fonctions des modules Array et List, ainsi que les fonctions de la bibliothèque standard (celles qui s'écrivent sans nom de module, comme max ou incr ainsi que les opérateurs comme / ou mod) peuvent être librement utilisés.
On utilisera également le générateur pseudo-aléatoire int du module Random. Quand n est un entier supérieur ou égal à 1, l'appel Random. int n renvoie un entier dans l'intervalle
Les candidats ne devront faire appel à aucun autre module.
En Caml, les tableaux d'objets d'un certain type 'a sont représentés par le type 'a array. L'expression tab. (i) permet d'accéder à l'élément situé en i-ème position du tableau tab. Dans le texte, en dehors du code Caml, cet élément sera noté
-
S est un ensemble fini dont les éléments sont les sommets deG ; -
A = (a_0, a_1, …, a_(m − 1)) est la suite des arêtes deG , une arête étant une partiea = {s, t} deS de cardinal 2 . Les sommetss ett sont appelés les extrémités de l'arêtea et on dira que a relies ett . Sis ett sont reliés par une arête, on dit qu'ils sont voisins ou adjacents.
Ainsi, les graphes sont non orientés et il n'y a pas d'arête reliant un sommet à lui-même. Par contre, à partir de la partie V, il est possible que plusieurs arêtes aient les mêmes extrémités.
Par convention, nous noteronsn (respectivementm ) le nombre de sommets (respectivement d'arêtes) du graphe et nous supposerons queS = {0, 1, …, n − 1} = S_n .
Un graphe sera représenté par le type
type graphe = int list array
SiG est un graphe représenté parg , alors le nombre de sommetsn du graphe est donné par la longueur du tableau g. De plus, sis ∈ S , alors g. (s) est une liste contenant les indices des sommets voisins des , dans un ordre quelconque, chaque sommet apparaissant autant de fois qu'il existe d'arêtes verss .
let
peut être représenté par le graphique de la figure 1.

Par ailleurs, l'ordre des arêtes ayant une importance en partie V , on convient de numéroter les

- Si
s ∈ S_n , le tableau d'adjacence des est le tableau, dans un ordre quelconque, des voisins des , chaque sommet apparaissant autant de fois qu'il existe d'arêtes verss . On noteAdj le tableau de taillen tel que, pour touts ∈ {0, 1, …, n − 1}, Adj[s] est le tableau d'adjacence du sommets . Adj est donc représenté par une variable adj de type int array array. - Un chemin dans
G est une suitec = (s_0, s_1, …, s_(j − 1), s_j, …, s_(k − 1), s_k) où pour toutj compris entre 1 etk, s_(j − 1) ets_j sont des sommets voisins. On dira quec est un chemin des_0 às_k de longueurk . Par convention, pours sommet deG , il existe un chemin de longueur nulle des às . - La composante connexe d'un sommet
s deG , notéeC_s , est l'ensemble des sommetst deG tels qu'il existe un chemin des àt . - On dit que
G est connexe si pour tous sommetss ett deG , il existe un chemin des àt . - Un cycle dans
G est un chemin de longueurk ⩾ 2 d'un sommet à lui-même et dont les arêtes sont deux à deux distinctes. On dit queG est acyclique s'il ne contient aucun cycle. - Un arbre est un graphe connexe acyclique.
I Quelques fonctions auxiliaires
nombre_aretes : graphe -> int
qui, appliquée à g représentant un graphe
Q 2. Écrire une commande Caml permettant de créer le tableau des tableaux d'adjacence Adj associé au graphe
On rappelle que la fonction Array.of_list : 'a list
Q 3. Écrire une fonction
adjacence : graphe -> int array array
qui, appliquée à g représentant un graphe
Q 4. Écrire une fonction
rang : int * int -> int * int -> int
telle que rang (p,q) (s, t) renvoie le rang de l'arête
Q 5. Écrire de même sa fonction réciproque
sommets : int * int -> int -> int * int
telle que sommets (
Q 6. Écrire une fonction
quadrillage : int -> int -> graphe
telle que l'instruction quadrillage p q renvoie le graphe représentant
II Caractérisation des arbres
II.A - Propriétés sur les arbres
-
S_n = ⋃_(s ∈ S_n)C_s ; - pour tous sommets
s ett , soitC_s = C_t , soitC_s ∩ C_t = ∅ .
Pour
Q 9. On suppose que
Q 10. Montrer que les trois propriétés suivantes sont équivalentes:
(i)
(ii)
(iii)
II.B - Manipulation de partitions
- de calculer, pour
s ∈ S_n , le représentant de la partieX_i contenants ; cet élément sera également appelé représentant des ; - pour deux entiers
s ett représentant des parties distinctesX_i etX_j , de transformerP en réunissantX_i etX_j, s out devenant le représentant de la partieX_i ∪ X_j .
Nous représenterons une partitionP = {X_1, …, X_k} deS_n par une forêt: chaqueX_i est représenté par un arbre dont les noeuds sont étiquetés par les éléments deX_i et de racine le représentantr_i deX_i , les arcs étant orientés vers la racine. Nous noteronsh(r_i) la hauteur de l'arbreX_i , c'est-à-dire la longueur de sa plus longue branche. Ainsi,P_9 = {{0, 2}, {1, 5, 6, 8}, {3, 4, 7}} est une partition deS_9 et peut par exemple être représentée par la forêt de la figure 3.

.jpg)
Une partition
[I -2; 5; 0; 7; 7; 6; -3; -2; 6 I]
- si
h(s) > h(t), s est choisi pour représentant de la partieX_i ∪ X_j et devient le père det ; - si
h(s) ⩽ h(t), t est choisi pour représentant de la partieX_i ∪ X_j et devient le père des .
.jpg)
representant : int array -> int -> int
Q 12. Écrire une fonction
union : int array -> int -> int -> unit
On note
Q 13. Soit
Q 14. En déduire les complexités des deux fonctions précédentes dans le pire des cas en fonction de
Q 15. Écrire une fonction
est_un_arbre : graphe -> bool
qui, appliquée à un graphe g représentant un graphe
III Algorithme de Wilson : arbre couvrant aléatoire
La figure 5 représente deux arbres couvrants du graphe

Nous allons pour cela faire évoluer dynamiquement un arbre
- parent. (r) = -1;
- si
s ∈ S_n n'est pas un sommet deT , parent. (s) = -2; - si
s ∈ S_n est un sommet deT autre que la racine, parent. (s) est le père des dans l'arbreT .
- au début du calcul,
c est réduit às ; - à tout moment,
c est de la forme (s = s_0, s_1, ⋯, s_(k − 1), s_k ) où les sommetss_0, …, s_k sont deux à deux distincts et les sommetss_0, …, s_(k − 1) ne sont pas des sommets deT ; - tant que l'extrémité
s_k n'est pas un sommet deT , on choisit aléatoirement et uniformément un voisinu des_k et on distingue, - si
u ∈ {s_0, s_1, …, s_k} , on supprime le cycle qui vient d'être formé etu devient le nouveau point d'arrivée du cheminc ; - sinon,
c devient le chemin(s = s_0, s_1, ⋯, s_(k − 1), s_k, u) ; - on renvoie le chemin (
s = s_0, s_1, ⋯, s_(k − 1), s_k ) une fois le calcul terminé.
type chemin
de telle sorte que si le chemin
c.fin <- u
{debut = 1; fin = 4; suivant = [|-5; 2; 5; 3; -1; 4|]}
Q 17. Que peut-on dire de la terminaison de cet algorithme?
Q 18. Écrire une fonction
marche_aleatoire : int array array -> int array -> int -> chemin
telle que l'appel marche_aleatoire adj parent s renvoie l'objet c représentant un chemin de
Q 19. Écrire une fonction
greffe : int array -> chemin -> unit
telle que l'instruction greffe parent c modifie parent de sorte à représenter l'arbre obtenu après la greffe du chemin
Q 20. Écrire une fonction
wilson : graphe -> int -> int array
tel que wilson gr renvoie un arbre couvrant aléatoire du graphe
IV Arbres couvrants et pavages par des dominos
Les cases dont les deux coordonnées sont paires sont colorées en noir, celles dont les deux coordonnées sont impaires sont colorées en gris, les autres sont colorées en blanc.
Si

type direction
et nous codons
- si
i etj ont la même parité et si(i, j) ≠ (0, 0) , p. (i). (j) est la direction du domino qui recouvre la case(i, j) (cette case est soit noire, soit grise) ; - sinon, pavage. (i). (j) prend la valeur
N (ces valeurs ne jouent aucun rôle).
.jpg)
Pour toute la suite du sujet, les valeurs de
let
IV.A - Exemples
Q 22. Considérons inversement l'arbre couvrant
IV.B - Calcul de l'arbre couvrant associé à un pavage

Q 24. Écrire une fonction
coord_noire : int -> int * int
Q 25. Écrire une fonction
sommet_direction : int -> direction -> int
Q 26. Écrire une fonction
phi : direction array array -> int array
V Utilisation du dual pour la construction d'un pavage
V.A − Graphe dual de
G_(p, q)
Ainsi, le sommet 6 de
Dans la suite du problème, nous notons :
-
n = pq le nombre de sommets deG_(p, q) ;
− n^∗ = (p − 1)(q − 1) + 1 le nombre de sommets deG_(p, q)^∗ ; -
m = p(q − 1) + q(p − 1) le nombre d'arêtes deG_(p, q) et deG_(p, q)^∗ ; -
A l'ensemble des arêtes deG_(p, q) ; -
A^∗ l'ensemble des arêtes deG_(p, q)^∗ .
- une fonction coord_grise : int -> int * int qui, appliquée à un sommet de
G_(p, q)^∗ autre que 0 , renvoie les coordonnées de la case grise qui correspond à ce sommet ; - une fonction numero : int * int -> int qui, appliquée à un couple (
x, y ) représentant une case noire ou grise de l'échiquierE_(p, q) , renvoie le sommet du grapheG_(p, q) ouG_(p, q)^∗ associé à cette case. On supposera également que dans tous les autres cas, numero renvoie la valeur 0 , y compris si les coordonnées sont en dehors de l'échiquier. Quandp = 4 etq = 3 , nous avons par exemple : numero(4, 2) = 6 , numero(1, 3) = 4 , et numero(3, 0) = 0 .

dual : unit -> graphe
telle que l'instruction dual () renvoie le graphe représentant
On suppose désormais définie une variable globale g_etoile par l'instruction
let g_etoile = dual () ;;
V.B - Dual d'un arbre couvrant
Soit
Q 30. En déduire que (
Si
Pour construire l'arbre
La figure 10 représente les deux arbres couvrants du graphe
.jpg)
vers_couple : int array -> int * bool array
telle que l'instruction vers_couple parent, où parent est un tableau représentant un arbre enraciné de
Q 33. Écrire une fonction
vers_parent : int * bool array -> int array
telle que l'instruction vers_parent (
Q 34. Déterminer les complexités de ces deux fonctions de conversion en fonction de
On supposera écrite une fonction vers_parent_etoile : int * bool array -> int array, ayant un fonctionnement similaire à vers_parent, qui prend en argument un couple (r, b_etoile) correspondant à un arbre couvrant
Q 35. Écrire une fonction
arbre_dual : int array -> int array
qui, appliquée au tableau parent représentant un arbre couvrant
V.C - Calcul du pavage associé à un arbre couvrant
Q 36. Décrire un procédé de construction, à partir des arbres
Q 37. Écrire une fonction
pavage_aleatoire : unit -> direction array array
telle que l'instruction pavage_aleatoire () renvoie une matrice de taille (
Q 38. Comment adapter cette méthode à la construction de pavages aléatoires d'un échiquier à
Questions fréquentes
4 questionsSur quoi porte le sujet d'option informatique Centrale MP 2021 ?Afficher ou masquer la section
Questions fréquentes
4 questionsSur quoi porte le sujet d'option informatique Centrale MP 2021 ?
Sur le pavage aléatoire d'un échiquier par des dominos, obtenu à partir d'arbres couvrants d'un graphe quadrillage : graphes en Caml, union-find, algorithme de Wilson et graphe dual.
Quelles erreurs le jury a-t-il relevées en option info Centrale MP 2021 ?
Des références mal utilisées, des listes traitées comme modifiables, des parenthèses oubliées, des filtrages incorrects, des codes trop longs et des preuves superficielles.
Le sujet d'option informatique Centrale MP 2021 est-il long ?
Oui, le jury le juge très long : peu de candidats ont abordé les parties IV et V, même si quelques rares copies ont tout traité correctement.
Quelle longueur de code est attendue en option informatique Centrale MP ?
Le jury indique qu'une réponse de programmation dépasse rarement une dizaine de lignes ; un long code non expliqué obtient rarement plus de la moitié des points, même correct.
Pas de description pour le moment
