TP 17

Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Vous êtes sur la page 1sur 2

MP2I — 2022-2023 Pierre Le Scornet Module Algorithmique

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

Figure 1 – Graphe 𝒢1 Figure 2 – Graphe 𝒢2

Exercice 1 – Cadre de travail, fonctions utilitaires

▶ 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 :

vrai vrai faux vrai vrai vrai


( )( )=( )
faux vrai vrai faux vrai faux
En C, on représentera ces matrices de booléens par des pointeurs de type bool** : ce pointeur pointe vers un
tableau de bool*, qui pointe eux-mêmes vers un tableau de booléens qui correspond à une ligne de la matrice.
Ainsi, la syntaxe m[i][j] permet d’accéder à la case (𝑖, 𝑗).
▶ Question 3 Écrire une fonction bool** create_matrix(int n, int p) qui alloue sur le tas le tableau
de pointeurs vers les lignes, chacune de ces lignes et initialise toute la matrice à false.
▶ Question 4 Écrire la fonction de libération correspondante void free_matrix(bool** m, int n).
▶ Question 5 Écrire une fonction bool** identity(int n) qui renvoie une matrice identité de taille 𝑛.
▶ Question 6 Écrire une fonction bool** produit(bool** a, bool** b, int n, int p, int q) qui à
deux matrices 𝑎 et 𝑏 de tailles (𝑛, 𝑝) et (𝑝, 𝑞) renvoie la matrice produit 𝑎𝑏 (au sens du produit défini plus
haut). Une complexité cubique est acceptable ici (même si on pourrait également faire mieux !). Une façon pas
trop compliquée de coder cette fonction est de commencer par coder la même fonction, avec la multiplication de
deux matrices de réels, puis de remplacer les + par des || et des * par des &&.

1
MP2I — 2022-2023 Pierre Le Scornet Module Algorithmique

Exercice 2 – Clôture transitive d’un graphe

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 ).

Exercice 3 – Axiomes et systèmes d’axiomes

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.

Vous aimerez peut-être aussi