Corrigé X-ENS 2026 Informatique B MP-PC-PSI — Partie I (Q1 à Q7) : Détection de cycles par parcours en profondeur
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é
est un graphe orienté dont les arcs sont étiquetés par des entiers ; on suppose : (A0) les arcs sortants d'un sommet portent les étiquettes consécutives ; (A1) est acyclique. En Python, G est un dictionnaire global : à chaque sommet, la liste de ses successeurs, l'étiquette d'un arc étant son indice dans la liste. Certaines fonctions ajoutent des arcs ; A1 est maintenu en toute circonstance. Les opérations élémentaires sur listes et dictionnaires coûtent . Exemple (figure 1 du sujet) :
G = {'a': ['c', 'd'], 'b': ['d', 'c'], 'c': ['X', 'Y'], 'd': ['Y', 'X'],
'e': ['W', 'Z'], 'W': ['Z'], 'X': [], 'Y': [], 'Z': []}
On note l'existence d'un chemin de vers . Variables globales : dictionnaires époque, sortie (un entier par sommet), entiers présent, compteur. Invariants, vrais hors de l'exécution de pp : (A2) pour tout ; (A3) pour tout arc ; (A4) pour tout arc . Code du sujet (figures 2 et 3) :
def pp(s):
global compteur # époque, sortie et présent sont implicitement globales
époque[s] = présent
for t in G[s]:
if époque[t] != présent:
pp(t)
sortie[s] = compteur
compteur += 1
def accessible(s, t):
global présent, compteur
if (époque[s] > époque[t] or
(époque[s] == époque[t] and sortie[s] < sortie[t])):
return False
présent += 1
pp(s)
return époque[t] == présent
def lier(u, s):
if not accessible(s, u):
G[u].append(s)
return True
return False
Q1. Sur la figure 1, état de sortie et époque après :
for s in G.keys():
sortie[s] = 0
époque[s] = 0
compteur = 0
présent = 1
pp('a')
Q2. Après présent += 1 (hors de pp), montrer que pour tout .
Q3. Après présent += 1 puis pp(s), montrer, pour : .
Q4. Pour un arc avec , montrer qu'après pp(s), .
Q5. Montrer qu'accessible(s, t) renvoie True si et seulement si .
Q6. Montrer qu'accessible(s, t) préserve A2, A3 et A4.
Q7. Montrer que lier(u, s) préserve A1, A2, A3 et A4.
Corrigé
Q1. L'appel pp('a') visite , puis (premier successeur), puis et , remonte à et visite , dont les deux successeurs et sont déjà à l'époque 1. Les sorties sont numérotées dans l'ordre de fin des appels : . Les sommets non atteints gardent leurs valeurs initiales.
| sommet | |||||||||
|---|---|---|---|---|---|---|---|---|---|
époque | 1 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 |
sortie | 4 | 0 | 2 | 3 | 0 | 0 | 0 | 1 | 0 |
C'est l'état obtenu en exécutant le code du sujet (et il est conforme à l'indication sortie['a'] = 4, sortie['X'] = 0).
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é.