TP 17
TP 17
TP 17
TP 17 : Manipulation de graphes en C
Dans ce TP, on se limite à la manipulation de graphes représentés par des matrices d’adjacence en C (contrairement au
DS qui manipulait des listes d’adjacence avec un indicateur du nombre de voisins). Ce TP est adapté d’un problème de
concours, reformulé en C et comme un problème sur les graphes.
On se place dans le cadre des graphes orientés avec des bouclettes. Soit 𝒢 = (𝑆, 𝐴) un tel graphe avec 𝑛 = |𝑆| sommets,
dont on fixe une énumération 𝑥0 , … , 𝑥𝑛−1 (on confondra donc 𝑆 et J0, 𝑛 − 1K). De plus, on suppose que toutes les
bouclettes (𝑥, 𝑥) sont dans le graphe.
Dans la suite, on note 𝑥 ⇒𝑘 𝑦 s’il existe un chemin de taille 𝑘 allant de 𝑥 à 𝑦. Notamment, 𝑥 ⇒0 𝑦 ssi 𝑥 = 𝑦. On notera
𝑥 ⇒ 𝑦 s’il existe 𝑘 ∈ ℕ tel que 𝑥 ⇒𝑘 𝑦, c’est-à-dire si 𝑦 est accessible depuis 𝑥.
Dans la suite, on définira les deux sommets suivants :
𝑥0 𝑥1 𝑥0 𝑥1
𝑥2 𝑥3 𝑥2 𝑥3
▶ Question 1 Soient 𝑥, 𝑦 ∈ 𝑆 deux sommets d’un graphe orienté 𝒢, et 𝑘, 𝑘′ ∈ ℕ avec 𝑘 ≤ 𝑘′ . Montrer que si
𝑥 ⇒𝑘 𝑦, alors 𝑥 ⇒𝑘′ 𝑦.
▶ Question 2 Soient 𝑥, 𝑦 ∈ 𝑆. Montrer que 𝑥 ⇒ 𝑦 ssi 𝑥 ⇒𝑛−1 𝑦.
On représente chaque graphe par une matrice de booléens. De plus, pour deux matrices de booléens ℳ𝑛 (𝔹),
on définit leur produit par la même formule que le produit de deux matrices de réels, en remplaçant la somme
par ∨ et le produit par ∧. Par exemple :
1
MP2I — 2022-2023 Pierre Le Scornet Module Algorithmique
Comme d’habitude, on représente un graphe 𝒢 par sa matrice d’adjacence 𝑀. On note que cette matrice est
exactement la matrice des 𝑥𝑖 ⇒1 𝑥𝑗 avec 𝑖, 𝑗 ∈ J0, 𝑛 − 1K.
▶ Question 1 Montrer que pour tous 𝑖, 𝑗 ∈ J0, 𝑛 − 1K et pour tout 𝑘 ∈ ℕ, on a (𝑀 𝑘 )𝑖,𝑗 = vrai ssi 𝑥𝑖 ⇒𝑘 𝑥𝑗 .
▶ Question 2 Montrer que la suite des (𝑀 𝑘 ) est stationnaire à partir du rang 𝑛 − 1.
On appelle 𝑀 𝑛−1 la clôture transitive de la matrice 𝑀.
▶ Question 3 Écrire une fonction bool** closure(bool** m, int n) qui calcule la clôture transitive de
la matrice m. On fera attention à ne pas laisser de fuite de mémoire (ce qui sera la principale difficulté).
▶ Question 4 Écrire une fonction bool* accessible(bool** m, int n, int x) qui renvoie un tableau 𝑡
de booléens de taille 𝑛 où 𝑡𝑦 est vrai ssi 𝑥 ⇒ 𝑦. On exige une complexité en 𝒪(𝑛2 ).
▶ Question 5 En déduire une nouvelle fonction closure2 de même prototype et valeur de retour que
closure mais de complexité en 𝒪(𝑛3 ).
Axiomes On dit qu’un sommet 𝑥 est un axiome dans le graphe 𝒢 si pour tout 𝑦 ∈ 𝑆, si 𝑦 ⇒ 𝑥 alors 𝑥 ⇒ 𝑦.
▶ Question 1 Déterminer les axiomes des graphes 𝒢1 et 𝒢2 .
▶ Question 2 Écrire une fonction bool is_axiome(bool** clos_m, int n, int i) qui prend en entrée
la clôture d’une matrice, sa taille 𝑛 et un sommet 𝑖 et renvoie si ce sommet est un axiome.
Suites unidirectionnelles de sommets On dit que la suite de sommets ⟨𝑦0 , … , 𝑦𝑘 ⟩ est une suite unidirec-
tionnelle de sommets de 𝒢 si pour tout 𝑖 ∈ J0, 𝑘 − 1K, 𝑦𝑖 ⇒ 𝑥𝑖+1 et 𝑦𝑖+1 ⇏ 𝑥𝑖 .
▶ Question 3 Montrer que les sommets d’une suite unidirectionnelle sont distincts.
▶ Question 4 Soit 𝑦 un sommet de 𝒢. Montrer qu’il existe un axiome 𝑥 tel que 𝑥 ⇒ 𝑦.
▶ Question 5 Déterminer les composantes fortement connexes de 𝒢2 .
▶ Question 6 On considère une composante fortement connexe 𝐶 de 𝒢 contenant un axiome. Montrer que
tous les sommets de 𝐶 sont des axiomes.
Systèmes d’axiomes On dit que 𝑋 ⊆ 𝑆 est un système d’axiomes si pour tout 𝑦 ∈ 𝑆, il existe 𝑥 ∈ 𝑋 tel
que 𝑥 ⇒ 𝑦. De plus, on dit qu’une composante fortement connexe du graphe 𝒢 est une composante source s’il
contient un axiome.
▶ Question 7 Montrer qu’en choisissant un sommet par composante source, on obtient un système
d’axiomes.
▶ Question 8 En déduire une fonction bool* axiom_system(bool** clos_m, int n) qui prend en entrée
une clôture transitive de m, sa taille n et renvoie un système d’axiomes représenté par un tableau de booléens
alloué sur le tas, avec des true pour les sommets dans le système et des false sinon.