Adloun

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
époque101100110
sortie402300010

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, gratuitement

Inscription gratuite en 30 secondes (e-mail, nom d'utilisateur, mot de passe, classe ou profil), sans carte bancaire : arrivée directe sur le corrigé.

Toutes les parties de l'épreuve

Corrigé complet gratuit →