Université Paris Diderot – Paris 7 Algorithmique
L3 Informatique Année 2009-2010, 1er semestre
TD n4 - Correction
Parcours de graphes
Exercice 1 Y’a qu’à...
Exercice 2 Non ! Par exemple, le graphe de sommets {a, b, c, d, e}et d’arêtes {(ab),(ac),(bd),(be),(cd),(ce)}.
L’arbre d’arêtes {(ab),(ac),(bd),(ce)}ne peut pas être obtenu par un parcours en largeur, mais est bien
un arbre de plus courts chemins partant de a.
Exercice 3 Y’a qu’à...
Exercice 4
Le premier problème est qu’on fait un parcours sans relance. Ainsi s’il y a un circuit inaccessible depuis
le sommet de départ, on ne le détectera pas.
Un problème plus sérieux est illustré en faisant tourner l’algorithme sur le graphe de la figure 1. Vous avez
vu en cours qu’un arc retour dans un parcours en profondeur permet de détecter un cycle. L’algorithme
proposé ici n’utilise que deux couleurs pour marquer les noeuds, ainsi un arc transverse ou un arc avant
peut être pris pour un arc de retour et signaler un faux circuit.
Fig. 1 – Un graphe dirigé
Une solution pourrait être de modifier l’algorithme pour distinguer les arcs retour des arcs transverses et
en avant. Mais, est-ce suffisant ? Est-ce que notre parcours en profondeur va systématiquement rencontrer
un arc retour si le graphe contient un cycle ? Oui, mais pour cela il faut démontrer le théorème suivant.
Théorème 1 Dans un graphe orienté il existe un circuit si et seulement si dans chaque parcours en
profondeur il existe un arc de retour.
Ainsi, si un parcours en profondeur ne trouve pas d’arc retour, c’est effectivement qu’il n’y a pas de
circuit.
1
L’algorithme correct est alors :
Procédure Cherche_Circuit(G)1
// G= (S,A) graphe orienté2
pour chaque sSfaire3
Marquage[s] := blanc ;4
Père[s] := nil ;5
pour chaque sSfaire6
si CC(G,s)alors terminer7
afficher("pas de circuit");8
9
Fonction CC(G,s)10
// G= (S,A) graphe orienté11
Marquage[s] := gris ;12
pour chaque xVoisinage(s,G)faire13
si Marquage[x]== blanc alors14
Père[x] := s;15
si CC(G,x)alors renvoyer vrai ;16
sinon17
si Marquage[x]== gris alors18
afficher(x);19
y:= s;20
tant que y6=xfaire21
afficher(y);22
y:= Père[y] ;23
renvoyer vrai;24
Marquage[s] := noir ;25
renvoyer faux;26
Cet algorithme se termine pour les mêmes raisons que l’algorithme de parcours en profondeur avec la
même complexité.
Preuve du théorème. L’implication () a été montré en cours : s’il y a un arc de retour (x, y) alors
le chemin de yvers xdans l’arbre de parcours et l’arc (x, y) forment le circuit.
Pour montrer la réciproque (), supposons qu’il existe un circuit Cdans Get nommons vle premier
sommet de ce circuit qui est visité pendant le parcours en profondeur. Nommons ple prédécésseur de v
sur ce circuit. En utilisant la notion de date de début et de date de fin utilisée dans le cours1, à l’instant
début[v], tous les sommets du circuit sont blancs, ou autrement dit, pour chaque sommet xdu circuit
différent de v:début[v]< début[x]. Il suffit alors de montrer qu’à l’instant f in[p] le sommet Vest encore
gris. Autrement dit, il suffit de montrer f in[p]< f in[v].
Par la propriété des intervalles de traitement2et l’inégalité précédente, chacun des sommets xde Cest
dans un des deux cas suivants :
1. soit début[v]< début[x]< f in[x]< f in[v]
2. soit début[v]< f in[v]< début[x]< f in[x]
Si le sommet pest dans le cas 1 le résultat est immédiat.
Si ce sommet est dans le cas 2, montrons qu’il y a une contradiction. En effet, cela signifirait que le
sommet pqui est accessible depuis vn’a pas été visité à la fin de l’exploration de v, ce qui est contraire
à l’intuition du parcours en profondeur.
1rappel : début et fin donnent les dates du début et de la fin de traitement des sommets
2voir cours
2
Plus précisement, examinons la situation à l’instant fin[v]. À cet instant d’après la propriété des inter-
valles, un sommet xdu circuit Cest soit noir (cas 1), soit blanc (cas 2). Par hypothèse, pest blanc,
et considérons le premier prédecesseur de psur Cqui soit noir (ce prédécesseur existe, car vest noir),
nommons le s. Le successeur de ssur Cest blanc. Or, on vérifie aisément sur la définition de l’algorithme,
qu’à tout instant le successeur d’un noeud noir est noir. Le successeur de ssur Cne peut être blanc et
noir à la fois. Contradiction.
Exercice 5 On fait une modification du parcours en largeur. En effet, il trouve des plus courts chemins,
donc il y a lieu d’espérer qu’il trouve aussi des plus courts circuits. Cet algorithme est suivi d’une preuve
pour se convaincre de cette affirmation.
Procédure Cherche_Circuit(G,s)1
// G= (S,A) graphe orienté2
pour chaque xSfaire3
Marquage[x] := faux ;4
Père[x] := nil ;5
F:= File_Vide ;6
Enfiler(s,F);7
Marquage[s] := vrai ;8
Profondeur[s] := 0 ;9
tant que Fnon vide faire10
x:= Defiler(F);11
pour chaque yVoisinage(x,G)faire12
si non(Marquage[y])alors13
Enfiler(y,F);14
Marquage[y] := vrai ;15
Père[y] := x;16
Profondeur[y] := Profondeur[x] + 1;17
sinon18
si y=salors19
tant que x6=nil faire20
afficher(x);21
x:= Père[x] ;22
renvoyer vrai ;23
Preuve :
Terminaison. On étudie les exécutions possibles de l’algorithme. Si une exécution entre dans le sinon
de la ligne 18, alors l’algorithme termine (en renvoyant vrai). Si au contraire elle n’entre jamais dans
ce sinon, alors elle se déroule exactement comme un parcours en profondeur, et donc termine aussi. On
conclut que l’algorithme termine.
Preuve que l’algorithme trouvera un circuit s’il y en a un passant par s. On suppose qu’il
existe au moins un circuit passant par s. On considère, parmi les circuits de longueur minimale passant
par s, les sommets de plus grande profondeur en partant de s. Parmi ceux-là, l’un d’eux sera le premier
atteint par le parcours en largeur effectué par l’algorithme. Pour ce sommet, on entre dans le sinon de
la ligne 18, et l’algorithme renvoie vrai.
Jusqu’à ce qu’on entre dans le sinon de la ligne 18, les invariants du cours sur le parcours en largeur
sont vérifiés. En particulier, les sommets dont la distance depuis s est strictement inférieure ont déjà
été visités, et l’arbre obtenu est un arbre des plus courts chemins depuis s.
Minimalité d’un circuit trouvé Ainsi, au moment où on rentre dans le sinon, on trouve donc un
circuit sur s. Et on sait que tout sommet x dont la distance à s est strictement inférieure a été visité
précédemment. Puisqu’on n’est entré dans le sinon de la ligne 18 à la visite de x, c’est que x n’est pas
lié a s. On en déduit que le cycle passant par s trouvé par l’algorithme est de longueur minimale.
3
Exercice 6 Tout graphe non orienté et connexe Gvérifie une et une seule des conditions suivantes :
soit Gest un arbre,
soit Gcontient un cycle.
Or d’après le cours, un graphe non orienté connexe G= (S, A) est un arbre si et seulement si |A|=|S|1.
Pour tester si un tel graphe possède un cycle, il suffit donc de tester si |A|>|S| − 1. Cet algorithme ne
permet cependant pas d’exhiber un cycle dans le graphe.
Exercice 7 Un pseudo-code possible du parcours en profondeur avec relance. On n’utilise pas de
marques : les dates remplacent. Un début à -1 signifie un sommet non encore atteint, un début 0
mais une fin de -1 signifie un sommet en cours de visite.
Variables globales: sommet x,y; entier temps = 0, d[V], f[V] tableaux initialises à -1
Pour x de 1 a n
Si marquage[x] = faux
PP(x)
Procedure PP(sommet v)
d[v] = temps++
pour chaque voisin y de v faire
si d[y] == -1
Afficher (v,y) est un arc de parcours
PP(y)
sinon si f[v] == -1
Afficher (v,y) est un arc de retour (aussi appelé en arrière)
sinon si f[y] < d[v]
Afficher (v,y) est un arc transversal
sinon
Afficher (v,y) est un arc en avant
f[v] = temps++
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 !