diff --git a/slides/cours_24.md b/slides/cours_24.md index 0f87f7888984065c9f9a3575b0388fcd84229ca8..7813713ea57e12e63ca7942dd6a1a31b5bfa4be9 100644 --- a/slides/cours_24.md +++ b/slides/cours_24.md @@ -601,8 +601,8 @@ $$ * Trouver un chemin d'un sommet à un autre; * Trouver si le graphe est connexe; * Il existe *deux* parcours principaux: - * en largeur; - * en profondeur. + * en largeur (Breadth-First Search); + * en profondeur (Depth-First Search). * Ces parcours créent *un arbre* au fil de l'exploration (si le graphe est non-connexe cela crée une *forêt*, un ensemble d'arbres). # Illustration: parcours en largeur @@ -744,7 +744,7 @@ initialiser(graphe) // tous sommets sont non-visités file = visiter(sommet) // sommet est un sommet du graphe au hasard tant que !est_vide(file) v = défiler(file) - file = visiter(u) + file = visiter(v) ``` ## Que fait visiter? @@ -807,4 +807,76 @@ graph LR; {width=80%} +# Parcours en profondeur + +## Idée générale + +* Initialiser les sommets comme non-lus +* Visiter un sommet +* Pour chaque sommet visité, on visite un sommet adjacent s'il est pas encore visité récursivement. + +## Remarque + +* La récursivité est équivalent à l'utilisation d'une **pile**. + +# Parcours en profondeur + +## Pseudo-code (5min) + +. . . + +```C +initialiser(graphe) // tous sommets sont non-visités +pile = visiter(sommet) // sommet est un sommet du graphe au hasard +tant que !est_vide(pile) + v = dépiler(pile) + pile = visiter(v) +``` + +## Que fait visiter? + +. . . + +```C +pile visiter(sommet) + sommet = visité + pour w = chaque arête de sommet + si w != visité + pile = empiler(pile, w) + retourne pile +``` + + +# Exercice + +* Établir la liste d'adjacence et appliquer l'algorithme de parcours en profondeur au graphe + +```{.mermaid format=pdf width=400 loc=figs/} +graph LR; + 1---2; + 1---3; + 1---4; + 2---3; + 2---6; + 3---6; + 3---4; + 3---5; + 4---5; +``` + +# Interprétation des aprcours + +* Un graphe vu comme espace d'états (sommet: état, arête: action); + * Labyrinthe; + * Arbre des coups d'un jeu. +. . . + +* BFS (Breadth-First) ou DFS (Depth-First) parcourent l'espace des états à la recherche du meilleur mouvement. + * Les deux parcourent *tout* l'espace; + * Mais si l'arbre est grand, l'espace est gigantesque! + +. . . + +* BFS explore beaucoup de coups dans un futur proche; +* DFS explore peu de coups dans un futur lointain.