CCINP Informatique MPI 2026Sujet et rapport du jury
- Classes P et NP, NP-complétude et réductions polynomiales
- Algorithmes d'approximation
- Graphes : cycle hamiltonien, arbre couvrant minimal, parcours en profondeur
- Programmation en C : structures, pointeurs, allocation dynamique, fichiers
- Programmation fonctionnelle en OCaml : listes et filtrage
- Raisonnement par récurrence double ou forte
- Combinatoire des mots
Téléchargements
- Corrigé : pas encore disponible
Présentation du sujet
Difficulté moyenneNP-complétude et 2-approximation du voyageur de commerce en C, suite de Prouhet-Thue-Morse en OCamlAfficher ou masquer la section
Présentation du sujet
Difficulté moyenneLe sujet comporte deux parties indépendantes. La première montre que le problème du voyageur de commerce (TSP) est NP-complet par deux réductions, puis étudie une 2-approximation fondée sur un arbre couvrant minimal, à programmer en C. La seconde définit la suite de Prouhet-Thue-Morse de plusieurs façons, fait prouver leur équivalence par récurrence et programmer en OCaml des fonctions sur les mots, jusqu'à montrer que le mot de Thue-Morse ne contient pas de cube.
- 1Partie I : problème du voyageur de commerceAppartenance à NP, réductions de CYCLE-HAMILTONIEN vers TSP et de COUVERTURE-SOMMET vers CYCLE-HAMILTONIEN, 2-approximation par arbre couvrant minimal et implémentation en C avec lecture de fichier et allocation dynamique.
- 2Partie II : suite de Prouhet-Thue-MorseTrois définitions de la suite et preuves de leur équivalence, fonctions OCaml récursives sur les listes, mots sans carré ni cube et entrelacements.
Difficulté moyenne. Le jury juge la longueur adéquate et le sujet bien compris, avec une moyenne de 10,01, tout en notant que les thèmes traités sont moins accessibles pour un candidat de niveau moyen.
L'épreuve en chiffres
Moyenne 10,01 / 20 · écart-type 3,84 · 1 198 présents · où vous situez-vous ?Afficher ou masquer la section
L'épreuve en chiffres
- Moyenne
- 10,01/ 20
- Écart-type
- 3,84
- Présents
- 1 198
- Coefficient
- 12
- Durée
- 4 h
Votre note sur 20 à ce sujet, en conditions de concours.
Source : document officiel du concours, épreuve du 22 avril 2026. 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éesDéfinition de NP incomplète · NP-complet réduit à NP-dur · Complexité des algorithmes au programmeAfficher ou masquer la section
Ce qu'a observé le jury
6 erreurs relevéesLe sujet a bien discriminé les candidats sur des parties variées du programme : graphes, complexité, récurrence, programmation fonctionnelle et impérative. Les parties de programmation sont jugées globalement satisfaisantes. Les questions exigeant une démonstration rigoureuse et structurée ont permis de distinguer les candidats, et toutes les questions ont été traitées par au moins un candidat.
Les erreurs les plus sanctionnées
- 1Définition de NP incomplèteQ1, Q2
Beaucoup oublient de justifier l'existence d'un certificat et sa taille polynomiale en l'instance, même si une phrase suffit.
« La définition de NP n’est pas toujours bien maîtrisée »
- 2NP-complet réduit à NP-durQ11
NP-complet signifie à la fois NP-dur et dans NP, et il fallait rappeler que l'appartenance à NP avait été prouvée en Q1.
- 3Complexité des algorithmes au programmeQ3, Q12
L'étape 2 de l'algorithme était ambiguë et deux interprétations ont été acceptées, mais la complexité de Kruskal ou d'un parcours de graphe est parfois méconnue. En Q3, le graphe complet en O(|S|²) est oublié.
- 4Fichiers, pointeurs et allocations en CQ18
Les fonctions de lecture et d'écriture dans un fichier, les opérateurs d'adresse et de déréférencement et l'accès aux champs d'une structure sont mal maîtrisés. L'allocation d'un tableau à deux dimensions est souvent omise.
- 5Récurrence double oubliéeQ26, Q28
En Q28, la plupart des candidats ne voient pas qu'une récurrence double ou forte est nécessaire. En Q26, la difficulté était de nommer les deux définitions à comparer pour pouvoir rédiger la preuve.
« c’est probablement symptomatique de preuves par récurrence mal comprises / rédigées »
- 6Filtrages OCaml non exhaustifsQ32
Les filtrages ne couvrent pas tous les cas, par exemple quand une seule des deux listes est vide, et renvoyer false est confondu avec lever une exception.
Ce qui a été bien réussi
- Les questions Q4 à Q7, Q9, Q10, Q16 et Q17 sont généralement bien traitées.
- Les fonctions C des questions Q19 à Q22 sont souvent bien traitées.
- En OCaml, Q23, Q31, Q36, Q40 et Q41 sont bien ou souvent bien traitées.
Conseils du jury
- Connaître la définition précise de NP et rédiger explicitement le certificat.
- Revoir la notion d'algorithme d'approximation et l'hypothèse d'inégalité triangulaire qu'elle utilise ici.
- Choisir le bon type de récurrence et nommer les objets à comparer avant de rédiger la preuve.
- Utiliser les fonctions du programme, comme List.length, au lieu de les recoder.
- Préférer une disjonction de cas à une récurrence quand elle suffit.
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
Pas encore de corrigé pour ce sujet : voici des sujets proches corrigés.
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
ÉPREUVE MUTUALISÉE AVEC E3A-POLYTECH
ÉPREUVE SPÉCIFIQUE - FILIÈRE MPI
INFORMATIQUE
N.B. : le candidat attachera la plus grande importance à la clarté, à la précision et à la concision de la rédaction. Si un candidat est amené à repérer ce qui peut lui sembler être une erreur d'énoncé, il le signalera sur sa copie et devra poursuivre sa composition en expliquant les raisons des initiatives qu'il a été amené à prendre.
- -Utiliser uniquement un stylo noir ou bleu foncé non effaçable pour la rédaction de votre composition ; d'autres couleurs, excepté le vert, bleu clair ou turquoise, peuvent être utilisées, mais exclusivement pour les schémas et la mise en évidence des résultats.
- -Ne pas utiliser de correcteur.
- -Ecrire le mot FIN à la fin de votre composition.
Partie I - Problème du voyageur de commerce
Soit
Un cycle hamiltonien dans
- -CYCLE-HAMILTONIEN qui, étant donné un graphe non orienté
G = (S, A) , décide s'il existe un cycle hamiltonien dansG , - -COUVERTURE-SOMMET qui, étant donnés un graphe non orienté
G = (S, A) etm ∈ ℕ , décide s'il existe un sous-ensemble de sommetsS_c ⊆ S tel que|S_c| ≤ m et que chaque arête deA ait au moins une de ses extrémités dansS_c , - -TSP qui, étant donnés un graphe
G = (S, A, c) et un entierk ∈ ℕ , décide s'il existe un cycle hamiltonien dansG de coût inférieur ou égal àk .
I. 1 - Réduction de CYCLE-HAMILTONIEN vers TSP
Soit
- (i). on crée un nouveau graphe
G^′ = (S^′, A^′) qui est un graphe complet tel queS^′ = S , - (ii). on attribue un coût à chaque arête
deG^′ :- -si l'arête
(s, t) existe dansG , on lui attribue un coût de 1, - -si l'arête (
s, t ) n'existe pas dansG , on lui attribue un coût de 2,
- -si l'arête
- (iii). on fixe un seuil de coût
k = |S| .
Q4. Montrer que si CYCLE-HAMILTONIEN renvoie Vrai sur l'entrée
Q5. Montrer que si TSP renvoie Vrai sur l'entrée
I. 2 - Réduction de COUVERTURE-SOMMET vers CYCLE-HAMILTONIEN

- Q6.Le problème COUVERTURE-SOMMET répond-il Vrai pour
m = 2 ? pourm = 3 ? Si oui, donner pour chaque valeur dem un sous-ensembleS_c correspondant.
- (i). on construit
m sommetsa_1…a_m utilisés pour sélectionnerm sommets deG , - (ii). pour chaque arête
e = (s, t) deG , on construit un graphe gadgetG_e = (S_e, A_e) à 12 sommets et 14 arêtes avecS_e = {s_i(e), i ∈ [ [1, 6] ]} ∪ {t_i(e), i ∈ [ [1, 6] ]} et
A_e = {{s_i(e), s_(i + 1)(e)}}_(i ∈ [ [1, 5] ]) ∪ {{t_i(e), t_(i + 1)(e)}}_(i ∈ [ [1, 5] ]) ∪ {{s_3(e), t_1(e)}, {t_3(e), s_1(e)}} ∪ {{s_6(e), t_4(e)}, {t_6(e), s_4(e)}}. - (iii). pour chaque sommet
s ∈ S de degréd(s) , on connecte tous les graphes gadgets oùs apparaît. Pour ce faire, on construit un ensemble d'arêtesA_s = {{s_6(e_(s[j])), s_1(e_(s[j + 1]))}, j ∈ [ [1, d(s) − 1] ]} , où lese_(s[j]) sont les arêtes incidentes às ordonnées arbitrairement. Cette étape créé un chemin dansG^′ composé exactement des sommetsu_i(e) tels queu = s . - (iv). on complète les arêtes de
G^′ en connectant les sommetsa_1…a_m aux premiers et derniers sommets de chaque chemin créé dans l'étape précédente. Pour ce faire, on construit les arêtesA_c = {{a_i, s_1(e_(s[1]))}, {a_i, s_6(e_(s[d(s)]))}, i ∈ [ [1, m] ], s ∈ S} .
- (i). on construit
Q7. Dessiner le graphe gadget de l'arête
Soit
Q9. Donner les ensembles
Q10. Montrer que
1.3 - Conclusion des réductions
I.4-2-approximation du problème TSP
On montre alors, dans la suite, qu'il existe une 2-approximation du problème TSP. À cette fin, on propose l'algorithme 1.
Algorithme 1-2-approximation du problème TSP
Entrées :
G = (S, A, c), c : S × S → ℕ
Sortie : Un cycle hamiltonien
H
début
T = arbre couvrant de coût minimal de
G
L = liste des sommets visités lors d'un parcours en profondeur de
T
H = cycle hamiltonien qui visite les sommets dans l'ordre de
L .
- Q12.Quel algorithme peut-on utiliser pour réaliser l'étape 2 de l'algorithme 1 ? Quelle est la complexité de votre solution ?
On noteH^∗ un cycle hamiltonien de coût optimal pour le problème TSP. On note égalementc(E) le coût associé à un cheminE , qu'il soit représenté par une suite ordonnée d'arêtes ou de sommets. - Q13.Montrer que
c(T) ≤ c(H^∗) .

- Q14.Montrer que
c(L) ≤ 2c(H^∗) . - Q15.Montrer qu'il est possible de supprimer la visite d'un sommet dans
L sans augmenter le coût du parcours. - Q16.En déduire comment construire
H , résultat de l'algorithme 1. - Q17.En conclure que l'algorithme 1 produit une 2-approximation de TSP.
// Structure de graphe
struct Graphe_s {
int n; // Nombre de sommets
int** C; // Matrice des coûts
};
typedef struct Graphe_s Graphe;
// Structure Arbre Couvrant de coût minimal
struct ACM_s {
int* parent; // Tableau indiquant le parent de chaque sommet dans l'arbre
int n; // Nombre de sommets de l'arbre
};
typedef struct ACM_s ACM;
// Structure Cycle Hamiltonien
struct CH_s {
int* cycle; // Sommets dans l'ordre d'apparition dans le cycle
int l; // Longueur du cycle = taille du tableau cycle
};
typedef struct CH_s CH;
ACM* a = malloc(sizeof(ACM));
a->n = n;
a->parent = malloc(n * sizeof(int));
Soit un fichier texte, présent sur le disque et correctement écrit, de la forme :
fichier.txt
n p
s1 t1 c1
s2 t2 c2
...
sp tp cp
- Q18.Écrire une fonction de prototype Graphe* creer_graphe(char* nom_fichier) qui créé un graphe à partir de la lecture d'un fichier texte dont le nom est spécifié dans la chaîne de caractères nom_fichier. On rappelle les fonctions suivantes de gestion des fichiers :
- -FILE *fopen(char *nom_fichier, char *accessMode) ouvre un fichier de nom nom_fichier selon le mode d'ouverture spécifié par accessMode. Pour une ouverture en mode lecture texte, on peut prendre accessMode="r" ;
- -int fclose(FILE *f) ferme le fichier pointé par f ;
- -int fscanf(FILE
∗ f , char *s , ... ) lit dans le fichier pointé par f une chaîne de caractères et utilise le paramètre s pour préciser le format à utiliser pour décoder la chaîne de caractères. Les valeurs lues sont stockées, une à une, dans les paramètres suivants de la fonction, dont la mémoire doit avoir été allouée. Ainsi, fscanf( f, "%d %d",&i,&j); lit dans f une ligne composée de deux entiers, séparés par un espace et les stocke aux adresses &i et &j.
- Q19.Écrire une fonction de prototype void dfs(ACM* a, int s, int* chemin, int* indice) qui réalise un parcours en profondeur de l'arbre a dont la racine est s. chemin est un tableau d'entiers, chemin[i] contenant le i-ème sommet du parcours : à chaque fois qu'un sommet est exploré, il est ajouté au tableau chemin à la position spécifiée par *indice (passage par pointeur de l'entier).
- Q20.Écrire une fonction de prototype CH* calcule_CH(int* chemin, int n) qui transforme le chemin calculé par dfs en un cycle hamiltonien. On prendra soin d'allouer correctement la structure de donnée retournée par la fonction et de refermer le chemin pour obtenir un cycle.
- Q21.Écrire des fonctions void free_ACM(ACM* a) et void free_CH(CH* cycle) qui désallouent la mémoire précédemment allouée. On supposera que la fonction Recherche_ACM n'effectue pas d'allocation mémoire supplémentaire.
- Q22.Écrire une fonction de prototype CH* TSP2 (Graphe* G) qui calcule une 2-approximation de TSP. On prendra soin d'allouer/désallouer la mémoire lorsque cela est nécessaire.
Partie II - Suite de Prouhet-Thue-Morse
L'objectif de cette partie est d'étudier quelques définitions et propriétés de la suite de Prouhet-Thue-Morse (abrégé PTM), du nom des mathématiciens français, norvégien et américain Eugène Prouhet, Axel Thue et Marston Morse.
Dans toute la suite, on note :
- -
Σ = {0, 1} un alphabet,Σ^∗ l'ensemble des mots surΣ, ε le mot vide et|m| la longueur d'un motm , - -"." l'opérateur de concaténation de mots de
Σ^∗ , - -si
m ∈ Σ^∗, m¯ le mot obtenu en remplaçant dansm les 0 par de 1 et les 1 par des 0, - -pour
n ∈ ℕ, t_n len -ème terme de la suite PTM, - -pour
n ∈ ℕ, T_n = t_0 t_1⋯t_(2^n − 1) le mot construit l'aide des2^n premiers termes de la suite PTM.
Pour
- Q24.Écrire une fonction récursive de signature compte_bits_a_un : int -> int telle que compte_bits_a_un n renvoie le nombre de bits à 1 dans l'écriture en base 2 de l'entier
n . - Q25.En déduire une fonction de signature affiche_ptm : int → unit qui affiche le mot
T_n . On écrira une fonction auxiliaire récursive de signature puissance 2 : int -> int qui calcule2^n . Pour afficher lest_i , on utilisera la fonction print_int de signature print_int : int -> unit.
On pose
Définition 3 (troisième définition)
On définit la suite PTM de manière récursive :
Définition 4 (quatrième définition)
Un morphisme sur
On définit alors le morphisme suivant sur les éléments de
Q28. Montrer que pour tout
On représente maintenant un mot de
Q29. Écrire une fonction de signature thue_morse_4 : int -> int list, un appel à thue_morse_4 n générant
II. 2 - Mot infini de Thue-Morse
Soit
Par exemple, le mot
Q30. Montrer qu'il n'existe pas de mots de
Q31. Écrire une fonction récursive de signature divise_mot : int list -> int list * int list qui divise un mot
Q32. En déduire une fonction de signature est_carre : int list -> bool qui détermine si un mot
Q33. Montrer que
Définition 6 (entrelacement)
Q35. Écrire une fonction de signature est_entrelacement : int list -> bool telle que l'appel est_entrelacement m renvoie true si m est un entrelacement, false sinon. On pourra tester récursivement toutes les longueurs de facteurs possibles et, pour un facteur donné, vérifier s'il apparaît ailleurs dans le mot avec chevauchement. On utilisera obligatoirement la fonction sousliste.
Q36. Montrer que si un mot
- Q37.Montrer que si un mot
m est un entrelacement, alors il contient un facteur de la forme avava, oùa ∈ Σ etv ∈ Σ^∗ . - Q38.Soit
m = a_0 a_1⋯a_(2n − 1) ∈ Σ^∗ tel que, pour touti ∈ [ [0, n − 1] ], a_(2i)a_(2i + 1) s'écrit soit 01, soit 10. Montrer qu'il n'est pas possible d'écrire les mots0m0 et1m1 sous la formeb_0 b_1⋯b_(2n + 1) , où, pour touti ∈ [ [0, n] ], b_(2i)b_(2i + 1) s'écrit soit 01, soit 10.
- Q39.Montrer, en utilisant Q37 et l'indication précédente, que si
μ(m) est un entrelacement, alorsm est un entrelacement. - Q40.Montrer par récurrence que pour tout
n ∈ ℕ, T_n n'est pas un entrelacement. - Q41.En déduire que pour tout
n ∈ ℕ, T_n ne contient pas de cube.
FIN
Questions fréquentes
4 questionsSur quoi porte le sujet d'informatique CCINP MPI 2026 ?Afficher ou masquer la section
Questions fréquentes
4 questionsSur quoi porte le sujet d'informatique CCINP MPI 2026 ?
Sur la NP-complétude du problème du voyageur de commerce et une 2-approximation programmée en C, puis sur la suite de Prouhet-Thue-Morse étudiée en OCaml, jusqu'à prouver l'absence de cube dans le mot de Thue-Morse.
Quelle est la moyenne de l'épreuve d'informatique CCINP MPI 2026 ?
Le rapport donne une moyenne de 10,01 avec un écart type de 3,84.
Quelles erreurs le jury a-t-il relevées en informatique MPI CCINP 2026 ?
Une définition de NP incomplète, l'oubli de la récurrence double ou forte, une notion d'algorithme d'approximation floue, des filtrages OCaml non exhaustifs et une syntaxe C mal maîtrisée pour les fichiers et l'allocation dynamique.
Quelles questions étaient les plus difficiles en informatique CCINP MPI 2026 ?
Le jury cite Q35 et Q39, plus rarement traitées, ainsi que Q28 sur la récurrence double, très mal traitée.
Pas de description pour le moment
