SPÉ MP, MPTD 07
Année 2016/2017 Parcours en profondeur
Sauf mention contraire, G= (S, A)désigne un graphe connexe non orienté.Sest l’ensemble des
sommets du graphe, Aest l’ensemble des arêtes. Quitte à renommer les sommets de G, on peut supposer
que S={0,1, . . . , n 1}nest le nombre de sommets de G. On note également mle nombre d’arêtes
de G. On représente en Caml un graphe Gànsommets par un tableau gde nlistes d’entiers. Pour
u= 0,1, . . . , n 1,g.(u) est la liste des voisins de udans le graphe G. On définit ainsi les types
type sommet = int
type arete = int * int
type graphe = sommet list array
De petits graphes seront bien pratiques pour tester les fonctions. Nous appellerons le graphe ci-dessous
l’exemple 1.
0
1
2
3 4
5 6
7 8
let ex01 = [|[1;2];[0;2;3];[0;1;3];[1;2;4;5];[3;5;6];[3;4;7];[4;8];[5;8];[6;7]|].
Voici un deuxième exemple, un graphe dont tous les sommets sont de degré pair.
0 1
23
4
5
6
7
let ex02 = [|[1;3];[0;2;6;7];[1;3;4;5];[0;2;4;5];[2;3];[2;3];[1;7];[1;6]|].
Vous disposez également des fonctions graphe_complet,graphe_cycle et graphe_chemin et graphe_cube
prenant en paramètre un entier net renvoyant respectivement un graphe complet Knànsommets, un
cycle Cnde longueur n, un chemin Pnànsommets, et « l’hypercube » Qnà2nsommets. Qnest défini
de la façon suivante : l’ensemble de ses sommets est {0,1}net deux sommets sont reliés par une arête si
et seulement si les n-uplets correspondants diffèrent en exactement une position.
On définit enfin le type couleur = Blanc | Noir
I- Parcours en profondeur
Le parcours en profondeur (Depth First Search, ou DFS) du graphe Gà partir d’un sommet sfonc-
tionne comme suit. L’algorithme opère sur
Une pile Pinitialement vide.
Un tableau de couleurs toutes initialisées à Blanc.
Un tableau de pères initialisés à 1. Ce tableau contiendra les informations nécessaires et suffi-
santes pour obtenir un arbre couvrant de G.
1
Deux tableaux premiers et derniers de « temps » initialisés à 1. Ces tableaux contiendront les
temps d’empilement et de dépilement des sommets du graphe.
Voici le pseudo-code de l’algorithme :
01 P <- pile vide
02 couleurs(s) <- Noir
03 i <- 1
04 premiers(s) <- 1
05 pères(s) <- -1
06 empiler s dans P
07 tant que P est non-vide:
08 i <- i + 1
09 x <- sommet de P
10 si x a un voisin non colorié y:
11 couleurs(y) <- noir
12 pères(y) <- x
13 premiers(y) <- i
14 empiler y dans P
15 sinon:
16 derniers(x) <- i
17 dépiler x de P
18 renvoyer (pères, premiers, derniers)
Cet algorithme peut être écrit avec une complexité en O(m+n). On se contentera ici d’une implé-
mentation en O(mn)(la difficulté portant sur la ligne 10).
1. Écrire une fonction dfs : graphe -> sommet -> sommet array * int array * int array telle
que l’appel dfs g s renvoie un triplet (peres, premiers, derniers) vérifiant :
peres est un tableau de taille n(le nombre de sommets du graphe g) tel que pour tout sommet
v,peres.(v) est le père de vdans l’arbre couvrant calculé par le parcours en profondeur, sauf
si v=s, auquel cas peres.(v) vaut 1.
premiers est un tableau de taille ntel que pour tout sommet v,premiers.(v) est l’instant
d’empilement de v.
derniers est un tableau de taille ntel que pour tout sommet v,derniers.(v) est l’instant
de dépilement de v.
Caml possède un module Stack permettant de réaliser toutes les opérations nécessaires sur les
piles. Se reporter à la documentation du langage.
2. Tester la fonction dfs sur les exemples 1 et 2, à partir de divers sommets d’origine. On ne le dira
pas à chaque fois mais jusqu’à la fin du TD, chaque fonction écrite devra être testée.
3. Tester la fonction dfs sur des cycles, des chemins, des hypercubes.
II- Tours eulériens
On rappelle que Gest un graphe connexe non orienté ayant marêtes. Un tour eulérien du graphe G
est une énumération (a0, . . . , am1)des arêtes de G, chaque arête de Gapparaissant une et une seule fois
dans l’énumération, telle que
Pour tout i[0, m1], les arêtes aiet ai+1 sont adjacentes (c’est à dire qu’elles ont une extrémité
commune).
Les arêtes am1et a0sont adjacentes.
Le graphe Gest dit eulérien lorsqu’il possède un tour eulérien.
1. Montrer que si Gest eulérien, tous ses sommets sont de degré pair.
2. Nous allons montrer par récurrence forte sur le nombre d’arêtes que si tous les sommets d’un
graphe G, non nécessairement connexe, sont de degré pair, Gest une réunion de cycles n’ayant
pas d’arêtes en commun.
2
(a) Constater que c’est vrai si Gn’a pas d’arête.
(b) Soit m1. Supposons la propriété vraie pour tous les graphes ayant strictement moins de m
arêtes. Soit Gun graphe ayant marêtes.
i. Soit P= (u0, . . . , uk)un chemin de longueur maximale kdans le graphe G. En considérant
le degré de u0dans G, prouver que Gcontient un cycle.
ii. Soit G0le graphe obtenu en enlevant à Gles arêtes d’un cycle de G(il en existe d’après
2bi). Montrer que l’hypothèse de récurrence s’applique à G0et conclure.
3. Montrer par récurrence sur le nombre d’arêtes que tout graphe connexe dont les sommets sont de
degré pair est eulérien.
4. Quels sont les graphes complets eulériens ? Quels sont les hypercubes eulériens ? L’exemple 1 est-il
eulérien ? Et l’exemple 2 ?
On suppose jusqu’à la fin de cette partie que Gest eulérien. La partie III montre comment trouver
efficacement des cycles dans le graphe Get ainsi, en utilisant les idées de la question précédente,
créer un tour eulérien de G. Nous allons plutôt utiliser l’algorithme suivant (que nous ne prouverons
que partiellement) dans lequel sest un sommet de G:
01 T <- l’arbre couvrant obtenu par dfs(G, s)
02 ordonner les listes d’adjacence de G en mettant pour chaque sommet
de G ses voisins dans T (père, fils) en fin de liste
03 Tour <- liste vide
04 u <- s
05 tant que u a un voisin:
06 v <- le premier élément de la liste des voisins de u
07 ajouter (v, u) à Tour
08 supprimer l’arête {u, v} du graphe G
09 u <- v
10 renvoyer Tour
5. Écrire la fonction tour_eulerien : graphe -> sommet -> arete list implémentant l’algorith-
me ci-dessus. Tester cette fonction sur l’exemple 2, sur le graphe complet K5, sur l’hypercube Q4.
Qu’arrive-t-il si on exécute cette fonction sur l’exemple 1 ? Sur l’hypercube Q3? Sur le graphe
complet K4?
6. Montrer que le nombre d’itérations de la boucle « tant que » est inférieur ou égal à m. En particulier,
l’algorithme termine.
7. Évaluer la complexité de l’algorithme. On discutera en particulier des lignes 02 et 08.
8. Une preuve partielle de correction ... On peut remarquer que l’algorithme enlève à chaque itération
un voisin du sommet courant et un voisin du sommet qui suit le sommet courant dans le chemin
créé. Ainsi, mis à part le premier et le dernier sommet du chemin, l’algorithme enlève deux voisins
dans le graphe à chacun des sommets du chemin.
(a) Montrer que l’algorithme termine sur le sommet s.
(b) Montrer que dans le graphe restant à la fin de la boucle, tous les sommets sont de degré pair.
III- L’espace des cycles
Ici encore, G= (S, A)est un graphe connexe non orienté possédant nsommets et marêtes. On munit
l’ensemble P(A)des parties de Ad’une structure d’espace vectoriel sur le corps Z/2Z={0,1}en posant :
Pour toutes parties A0et A00 de A,A0+A00 est la différence symétrique de A0et A00, définie par
A0+A00 = (A0\A00)(A00 \A0).
Pour toute partie A0de A,0.A0=et 1.A0=A0.
La vérification des propriétés d’espace vectoriel est sans difficulté. On remarquera que :
L’opposé de A0∈ P(A)pour l’addition est A0lui-même.
Si A1, . . . , Aksont des parties de Aet aA, alors aA1+. . . +Aksi et seulement si aest dans
un nombre impair des ensembles A1, . . . , Ak.
3
1. Quelle est la dimension de l’espace vectoriel P(A)? En donner une base.
À tout ensemble A0d’arêtes de Gest associé un sous-graphe de G,G0= (S0, A0)dont les sommets
sont les extrémités des arêtes de A0. Ainsi, on dira qu’un ensemble d’arêtes A0est un cycle, un,
chemin, etc., lorsque le sous-graphe associé est lui-même un cycle, un chemin, etc.
Définition .1 L’espace des cycles du graphe G, noté C(G), est le sous-espace vectoriel de P(A)
engendré par les cycles.
Nous admettrons :
Propriété .1 L’espace C(G)est un espace vectoriel de dimension mn+ 1.
Par exemple, A∈ C(G)si et seulement si Gest eulérien.
Définition .2 Soit Tun arbre couvrant de Gobtenu par un parcours en profondeur de G. Nous
appellerons rétro-arête de Gtoute arête de Gqui n’est pas une arête de T.
Remarquons que la notion de rétro-arête dépend évidemment de l’arbre couvrant choisi. Rappelons
aussi (cours !) qu’une rétro-arête relie toujours deux sommets dont l’un est un ancêtre de l’autre
dans l’arbre T.
2. Combien Gpossède-t-il de rétro-arêtes ? Nous allons voir que ce n’est pas une coïncidence.
3. À chaque rétro-arête de Gest clairement associé un cycle, que l’on crée en reliant les extrémités u
et vde la rétro-arête par l’unique chemin dans Treliant uàv. Montrer que les cycles associés aux
rétro-arêtes forment une famille libre de l’espace vectoriel C(G). Nous noterons Γcette famille.
4. Déduire de ce qui précède que Γest une base de l’espace vectoriel C(G).
5. Écrire une fonction retro_aretes : graphe -> sommet -> arete list prenant en paramètres
un graphe Get un sommet sde Get renvoyant la liste des rétro-arêtes de Gassociées à un arbre
couvrant obtenu par dfs à partir du sommet s. Chaque rétro-arête sera stockée sous la forme
(u, v)uest un ancêtre de vdans l’arbre couvrant T. Indication : c’est là qu’interviennent les
tableaux premiers et derniers renvoyés par dfs.
6. Écrire une fonction base_cycles : graphe -> sommet -> arete list list prenant en para-
mètres un graphe Get un sommet set renvoyant une base de l’espace des cycles de G.
7. On suppose que Gest eulérien.
(a) En utilisant II2, montrer que A∈ C(G).
(b) Montrer que A=PγΓγ.
(c) Cette égalité vous suggère-t-elle un algorithme de recherche de tour eulérien du graphe G?
4
1 / 4 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !