Avec la représentation d'un graphe par un dictionnaire comme précédemment, nous allons programmer en langage Python le DFS avec les variables suivantes :
Déroulement détaillé de la fonction dfs()
 |
P = {'g' : None} Q = ['g']
Découverts(gris ou noirs) = ['g']
Fermés(noirs) = []
|
 |
P = {'g':None , 'e':'g'}
Q = ['g', 'e']
Découverts(gris ou noirs) = ['g', 'e']
Fermés(noirs) = []
|
 |
P = {'g':None , 'e':'g' , 'b':'e'
Q = ['g', 'e', 'b']
Découverts(gris ou noirs) = ['g', 'e', 'b']
Fermés(noirs) = []
|
 |
P = {'g':None , 'e':'g' , 'b':'e' , 'a':'b'
Q = ['g', 'e', 'b', 'a']
Découverts(gris ou noirs) = ['g', 'e', 'b', 'a']
Fermés(noirs) = []
|
 |
P = {'g':None , 'e':'g' , 'b':'e' , 'a':'b' , 'c':'a'}
Q = ['g', 'e', 'b', 'a', 'c']
Découverts(gris ou noirs) = ['g', 'e', 'b', 'a', 'c']
Fermés(noirs) = []
|
 |
P = {'g':None , 'e':'g' , 'b':'e' , 'a':'b' , 'c':'a' , 'd':'c'}
Q = ['g', 'e', 'b', 'a', 'c', 'd']
Découverts(gris ou noirs) = ['g', 'e', 'b', 'a', 'c', 'd']
Fermés(noirs) = []
|
 |
P = {'g':None , 'e':'g' , 'b':'e' , 'a':'b' , 'c':'a' , 'd':'c'}
Q = ['g', 'e', 'b', 'a', 'c']
Découverts(gris ou noirs) = ['g', 'e', 'b', 'a', 'c', 'd']
Fermés(noirs) = ['d']
|
 |
P = {'g':None , 'e':'g' , 'b':'e' , 'a':'b' , 'c':'a' , 'd':'c'}
Q = ['g', 'e', 'b', 'a']
Découverts(gris ou noirs) = ['g', 'e', 'b', 'a', 'c', 'd']
Fermés(noirs) = ['d', 'c']
|
 |
P = {'g':None , 'e':'g' , 'b':'e' , 'a':'b' , 'c':'a' , 'd':'c'}
Q = ['g', 'e', 'b']
Découverts(gris ou noirs) = ['g', 'e', 'b', 'a', 'c', 'd']
Fermés(noirs) = ['d', 'c', 'a']
|
 |
P = {'g':None , 'e':'g' , 'b':'e' , 'a':'b' , 'c':'a' , 'd':'c'}
Q = ['g', 'e']
Découverts(gris ou noirs) = ['g', 'e', 'b', 'a', 'c', 'd']
Fermés(noirs) = ['d', 'c', 'a', 'b']
|
 |
P = {'g':None , 'e':'g' , 'b':'e' , 'a':'b' , 'c':'a' , 'd':'c' ,'f':'e'}
Q = ['g', 'e', 'f']
Découverts(gris ou noirs) = ['g', 'e', 'b', 'a', 'c', 'd', 'f']
Fermés(noirs) = ['d', 'c', 'a', 'b']
|
 |
P = {'g':None , 'e':'g' , 'b':'e' , 'a':'b' , 'c':'a' , 'd':'c' ,'f':'e'}
Q = ['g', 'e']
Découverts(gris ou noirs) = ['g', 'e', 'b', 'a', 'c', 'd', 'f']
Fermés(noirs) = ['d', 'c', 'a', 'b', 'f']
|
 |
P = {'g':None , 'e':'g' , 'b':'e' , 'a':'b' , 'c':'a' , 'd':'c' ,'f':'e'}
Q = []
Découverts(gris ou noirs) = ['g', 'e', 'b', 'a', 'c', 'd', 'f']
Fermés(noirs) = ['d', 'c', 'a', 'b', 'f', 'e']
|
 |
P = {'g':None , 'e':'g' , 'b':'e' , 'a':'b' , 'c':'a' , 'd':'c' ,'f':'e' , 'h':'g'}
Q = ['g', 'h']
Découverts(gris ou noirs) = ['g', 'e', 'b', 'a', 'c', 'd', 'f', 'h']
Fermés(noirs) = ['d', 'c', 'a', 'b', 'f', 'e']
|
 |
P = {'g':None , 'e':'g' , 'b':'e' , 'a':'b' , 'c':'a' , 'd':'c' ,'f':'e' , 'h':'g'}
Q = ['g']
Découverts(gris ou noirs) = ['g', 'e', 'b', 'a', 'c', 'd', 'f', 'h']
Fermés(noirs) = ['d', 'c', 'a', 'b', 'f', 'e' 'h']
|
 |
P = {'g':None , 'e':'g' , 'b':'e' , 'a':'b' , 'c':'a' , 'd':'c' ,'f':'e' , 'h':'g'}
Q = []
Découverts(gris ou noirs) = ['g', 'e', 'b', 'a', 'c', 'd', 'f', 'h']
Fermés(noirs) = ['d', 'c', 'a', 'b', 'f', 'e', 'h', 'g']
|
L'arborescence associée au parcours peut donc être modélisée de la façon suivante :
import random
class Maillon:
def __init__(self, valeur, suivant=None):
self.valeur = valeur
self.suivant = suivant
class Pile:
def __init__(self):
self.taille = 0 # nombre d'assiettes dans la pile
self.sommet = None
def empiler(self, valeur):
self.sommet = Maillon(valeur, self.sommet)
self.taille += 1
def depiler(self):
if self.taille > 0:
valeur = self.sommet.valeur
self.sommet = self.sommet.suivant
self.taille -= 1
return valeur
def estVide(self):
return self.taille == 0
def lireSommet(self):
return self.sommet.valeur
def dfs(G,s) :
P = {s: None}
Q = Pile()
Q.empiler(s)
while not(Q.estVide()) :
u = Q.lireSommet()
R=[y for y in G[u] if y not in P]
if R :
v=random.choice(R)
P[v]=u
Q.empiler(v)
else :
Q.depiler()
return P
G=dict()
G['a']=['b','c']
G['b']=['a','d','e']
G['c']=['a','d']
G['d']=['b','c','e']
G['e']=['b','d','f','g']
G['f']=['e','g']
G['g']=['e','f','h']
G['h']=['g']
print(dfs(G,'g'))