🚕Parcours⚓︎
On rappelle d'abord comment parcourir un arbre (qui est un graphe connexe, et sans cycle)
Parcours d'arbre⚓︎
On utilise print
, mais cela pourrait être n'importe quelle action lors du parcours.
class Arbre:
def __init__(self, racine, enfants):
self.racine = racine
self.enfants = enfants
def parcours(arbre):
"""Parcours récursif d'un arbre, (parcours en profondeur).
"""
print(arbre.racine)
for enfant in arbre.enfants:
parcours(enfant)
def parcours(arbre):
"""Parcours itératif d'un arbre en profondeur.
On utilise une pile.
"""
suite = Pile()
suite.empile(arbre)
while not suite.est_vide():
noeud = suite.dépile()
print(noeud.racine)
for enfant in noeud.enfants:
suite.empile(enfant)
def parcours(arbre):
"""Parcours itératif d'un arbre en largeur.
On utilise une file, et un code similaire !!!
"""
suite = File()
suite.enfile(arbre)
while not suite.est_vide():
noeud = suite.défile()
print(noeud.racine)
for enfant in noeud.enfants:
suite.enfile(enfant)
Exercice
Vérifier sur un arbre écrit à la main que les parcours proposés sont bons.
Parcours de graphe⚓︎
Exercice
-
Quels problèmes avons-nous à appliquer ces parcours sur des graphes ?
Réponse
Le parcours peut entrer dans un cycle, et il ne parcourt que la composante connexe !
-
Comment éviter de rentrer dans un cycle ?
Réponse
On va stocker dans une structure de données, des booléens pour indiquer si un sommet a déjà (ou va bientôt) être visité. On pourra alors faire un test avant de l'enfiler ou de l'empiler.
# Exemple de graphe d'ordre n, où
# les sommets sont numérotés de 0 inclus à n exclu.
def parcours(sommet_départ):
"""Parcours itératif d'un graphe,
parcours en profondeur, en partant de 'sommet',
uniquement de sa composante connexe.
"""
visité = [False for _ in range(n)]
suite = Pile()
suite.empile(sommet_départ)
visité[sommet_départ] = True
while not suite.est_vide():
sommet = suite.dépile()
print(sommet) # ou autre action
for enfant in sommet.enfants:
if visité[enfant] == False:
visité[enfant] = True
suite.empile(enfant)
Exercice
- Obtenir le parcours en largeur d'un graphe.
- Obtenir la distance du sommet le plus éloigné de
sommet_départ
. - Obtenir la distance la plus courte entre
sommet_départ
etsommet_destination
.
France-IOI⚓︎
Il faut atteindre le niveau 4 pour trouver beaucoup d'exercices sur les graphes.
C'est le début de la grande aventure !!!