Corrigé X-ENS 2026 Informatique B MP-PC-PSI — Partie II (Q8 à Q14) : Forme normale et unification
Sujet officiel du concours X-ENS, session 2026, épreuve Informatique B MP-PC-PSI. Corrigé rédigé par Ibrahim Alame.
Sujet officiel (PDF, site du concours)
Énoncé
Graphe de la partie I, avec de plus (A5) : degré sortant au plus 2. Un sommet de degré 0 est libre, de degré 1 lié, de degré 2 interne. Pour lié, est la cible de son arc sortant ; pour interne, et sont les cibles de ses arcs étiquetés 0 et 1. Figure 1 :
G = {'a': ['c', 'd'], 'b': ['d', 'c'], 'c': ['X', 'Y'], 'd': ['Y', 'X'],
'e': ['W', 'Z'], 'W': ['Z'], 'X': [], 'Y': [], 'Z': []}
La forme normale est définie par si est libre, si est lié, si est interne ; sur l'exemple, et . Code du sujet :
def fn(s):
if len(G[s]) == 0: # sommet libre
return s
elif len(G[s]) == 1: # sommet lié
return fn(G[s][0])
else: # sommet interne
return (fn(G[s][0]), fn(G[s][1]))
désigne le nombre de chemins partant de et aboutissant à un sommet libre (, ). Une extension de est un graphe acyclique obtenu en ajoutant à certains sommets libres un arc sortant étiqueté 0. Un problème d'unification est un ensemble de paires de sommets ; une solution est une extension où pour tout (ainsi est résolu par l'ajout de ). Pour et , on admet : (T1) a les mêmes solutions que ; (T2) si est lié, aussi ; (T3) si et sont internes, aussi ; (T4) si est libre, non lié et , alors a une solution si et seulement si a une solution contenant l'arc . unif(P) (figure 4) doit renvoyer True si et seulement si (liste de paires) a une solution, en ajoutant alors à G les arcs d'une solution :
def unif(P):
while len(P) > 0:
s, t = P.pop()
if len(G[s]) == 1:
P.append((G[s][0], t))
elif len(G[t]) == 1:
P.append((s, G[t][0]))
elif len(G[s]) == 2 and len(G[t]) == 2:
P.append((G[s][0], G[t][0]))
P.append((G[s][1], G[t][1]))
elif len(G[s]) == 0:
... # à compléter
else:
P.append((t, s))
return True
Q8. Sommets internes, liés, libres de la figure 1 ?
Q9. Prouver la terminaison de fn par une quantité strictement décroissante.
Q10. Montrer que la complexité de fn dans le pire cas est au moins exponentielle en le nombre de sommets.
Q11. Écrire fn_efficace(s), même résultat que fn(s), en complexité linéaire en le nombre de sommets.
Q12. Écrire taille(s) qui renvoie .
Q13. Montrer que n'a pas de solution (figure 1).
Q14. Compléter unif ; on peut utiliser lier(u, s) (partie I), qui ajoute l'arc si et seulement si cet ajout ne crée pas de cycle.
Corrigé
Q8. Les sommets internes (deux successeurs) sont ; le seul sommet lié est (avec ) ; les sommets libres sont , et .
Q9. Posons la longueur maximale d'un chemin issu de . Elle est bien définie : étant acyclique, un chemin ne repasse jamais par un sommet (sinon la portion entre deux passages serait un cycle), donc sa longueur est au plus où est le nombre de sommets ; . Les appels récursifs de fn(s) portent sur G[s][0] et G[s][1], c'est-à-dire sur des successeurs de . Or, pour tout arc , faire précéder un chemin maximal issu de de l'arc donne un chemin issu de , d'où . La profondeur de la récursion est donc au plus ; chaque appel en faisant au plus deux, l'arbre des appels est fini : fn termine. ( exactement pour libre, cas de base sans appel.)
Q10. Le temps de calcul est au moins proportionnel au nombre d'appels de fn. Construisons, pour , le graphe à sommets et , avec libre, lié à , et interne de successeurs (étiquette 0) et (étiquette 1) pour : c'est le motif de la figure 1 empilé fois. Il est acyclique (les arcs font décroître les indices ou vont de à ), de degré au plus 2.
def graphe_pire(k):
H = {'v0': []}
for i in range(1, k + 1):
H['w' + str(i - 1)] = ['v' + str(i - 1)]
H['v' + str(i)] = ['v' + str(i - 1), 'w' + str(i - 1)]
return H
Soit le nombre d'appels déclenchés par fn (lui compris). On a , et fn appelle fn et fn, lequel appelle fn : . Donc , puis . Le sous-calcul de est refait deux fois à chaque étage, et ces doublements se composent. La complexité de fn sur est donc : au moins exponentielle en . Le décompte a été vérifié en exécution pour avec une version instrumentée de fn. (Si l'on admet deux arcs parallèles, de successeurs donne même appels pour sommets.)
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é.