X ENS Informatique Commune MP PC PSI 2026Sujet
- Parcours en profondeur (graphes)
- Récursivité et preuve de terminaison
- Complexité algorithmique
- Structures de données Python (listes, dictionnaires)
- Bases de données relationnelles et requêtes SQL
Téléchargements
- Corrigé : pas encore disponible
- Rapport du jury : pas encore publié
Présentation du sujet
Détection de cycles dans un graphe orienté, unification de structures et représentation relationnelleAfficher ou masquer la section
Présentation du sujet
Ce sujet d'informatique commune, filières MP-PC-PSI, étudie en trois parties un graphe orienté acyclique représenté en Python. La première partie construit, à partir d'un parcours en profondeur, une fonction qui ajoute un arc sans créer de cycle. La deuxième définit la forme normale d'un sommet et le problème d'unification de deux sommets. La troisième traduit ces notions dans une base de données relationnelle interrogée en SQL.
- 1Partie I - Détection de cyclesÉtudie une fonction de parcours en profondeur et les invariants qu'elle maintient, pour construire une fonction accessible(s,t) testant l'existence d'un chemin, puis une fonction lier(u,s) qui ajoute un arc sans créer de cycle.
- 2Partie II - UnificationDéfinit la forme normale récursive d'un sommet, sa complexité, une version efficace en temps linéaire, puis le problème d'unification de deux sommets et un algorithme qui le résout à l'aide de la fonction lier de la partie I.
- 3Partie III - Représentation relationnelleTraduit le graphe en un schéma de base de données relationnelle (tables sommets et arcs) et demande d'écrire des requêtes SQL pour vérifier des invariants et détecter deux sommets de même forme normale.
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
16h30-18h30
FILIERES MP-PC-PSI
Epreuve n° 8
INFORMATIQUE B
L'utilisation des calculatrices n'est pas autorisée pour cette épreuve
Cycles et unification
- A0.Les arcs sortants d'un sommet donné sont étiquetés par des entiers consécutifs en partant de 0.
- A1.
G est acyclique.
- -L'expression len(a) renvoie la longueur
n . - -L'expression a[i] désigne le i-ième élément de la liste, pour
0 ≤ i < n . - -L'instruction a[i] = v affecte la valeur v au i-ième élément de la liste, pour
0 ≤ i < n . - -L'instruction a.append(e) ajoute l'élément e à la fin de la liste a.
- -L'expression a.pop() supprime et renvoie le dernier élément de la liste a.
- -Le test (k in d) renvoie True si k est une clé du dictionnaire d, et False sinon.
- -L'expression d [k] renvoie la valeur associée à la clé k dans le dictionnaire d, le cas échéant.
- -L'instruction
d[k] = v affecte la valeur v à la clé k dans le dictionnaire d.
Partie I. Détection de cycles
- -époque et sortie sont des dictionnaires associant un entier à chaque sommet de
G , - -présent et compteur sont des entiers.
- A2.époque
[s] ⩽ présent, pour tout sommets deG . - A3.époque
[s] ⩽ époque[t] pour tout arcs → t deG . - A4.époque
[s] = époque[t] ⇒ sortie[s] ⩾ sortie[t] pour tout arcs → t deG .
for s in G.keys():
sortie[s] = 0
époque[s] = 0
compteur = 0
présent = 1
pp('a')
présent += 1
présent += 1
pp(s)

# Variables globales.
# L'initialisation (cachée) satisfait les invariants.
G = { ... }
sortie = { ... }
époque = { ... }
présent = 0
compteur = 0
def pp(s):
"""
Effectue un parcours en profondeur à partir de ˋsˋ,
affecte l'époque ˋprésentˋ à tous les sommets visités,
ainsi qu'une certaine numérotation dans ˋsortieˋ.
"""
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
Question 5. Montrer qu'accessible(s, t) renvoie True si et seulement si
Question 6. Montrer qu'accessible(s, t) préserve les invariants A2, A3 et A4.
Question 7. Montrer que la fonction lier(u, s) préserve les invariants A1, A2, A3 et A4.
Partie II. Unification
A5. Le degré sortant des sommets de
Les sommets de degré 0 sont appelés sommets libres. Les sommets de degré 1 sont appelés sommets liés. Les sommets de degré 2 sont appelés sommets internes.
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]))
def accessible(s, t):
"""Renvoie True si, et seulement si, il existe un chemin de 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):
"""
Ajoute l'arc u -> s s'il ne crée pas de cycle.
Signale l'ajout réussi en renvoyant True.
"""
if not accessible(s, u):
G[u].append(s)
return True
return False
T1.
T2. Si
T3. Si
T4. Si
def unif(P):
"""
Ajoute des arcs dans G jusqu'à obtenir une extension solution de P.
Renvoie False si P n'a pas de solution. Renvoie True sinon.
"""
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
Partie III. Représentation relationnelle
- -une table sommets dont les colonnes sont
- -id, clé primaire entière,
- -degré, entier, représente le degré sortant,
- -sortie, entier,
- -époque, entier ;
- -une table arcs dont les colonnes sont
- -étiquette, entier,
- -source, clé étrangère vers sommets,
- -cible, clé étrangère vers sommets.
Questions fréquentes
4 questionsSur quels chapitres porte le sujet d'informatique commune MP-PC-PSI Polytechnique-ESPCI-ENS 2026 ?Afficher ou masquer la section
Questions fréquentes
4 questionsSur quels chapitres porte le sujet d'informatique commune MP-PC-PSI Polytechnique-ESPCI-ENS 2026 ?
Il porte sur les graphes (parcours en profondeur, détection de cycles), la récursivité et la complexité, puis sur les bases de données relationnelles et le langage SQL.
La partie II peut-elle être traitée indépendamment de la partie I ?
Oui, l'énoncé précise que la deuxième partie peut être traitée indépendamment de la première.
Ce sujet contient-il des questions de bases de données SQL ?
Oui, la troisième partie demande d'écrire deux requêtes SQL portant sur le graphe représenté par des tables sommets et arcs.
Faut-il programmer en Python pour ce sujet ?
Oui, plusieurs questions demandent d'écrire ou de compléter des fonctions Python, notamment une version efficace du calcul de la forme normale.
Pas de description pour le moment
