Parcourir un graphe en profondeur

Il y a plusieurs manières de parcourir un graphe, c’est à dire de se déplacer de sommet en sommet adjacent. Parmi les plus communes, on retrouve le parcours en largeur et le parcours en profondeur.

Présentation du parcours

Un parcours en profondeur permet de trouver tous les sommets atteignables depuis un sommet initial u, c’est-à-dire l’ensemble des sommets v pour lesquels il existe une marche menant de u à v.

L’idée est simple : à partir d’un sommet initial, on explore une mnarche aussi longtemps que possible sans jamais passer deux fois par le même sommet. Lorsqu’on est bloqué, on revient en arrière sommet par sommet jusqu’à trouver un voisin non visité. On explore alors une marche dans cette direction jusqu’à être bloqué à nouveau etc.

Attention : Ce parcours se fait sur le graphe, c’est à dire que dans PyRat, le pion ne bouge pas. Le parcours en profondeur renverra une marche finale, qui elle sera appliquée sous forme de mouvements.

Voici un programme Python (donné sous sa forme récursive) implémentant un parcours en profondeur de graphe :

Dans cet exemple, le graphe utilisé est le suivant, où le sommet source est 0 (représenté sous forme d’un tableau de listes) :

012345

Si vous exécutez ce code, vous verrez que le résultat n’est pas dans le même ordre pour les deux graphes testés, qui sont pourtant identiques (seul change l’ordre dans lequel sont listés les voisins des sommets).

Retrouver le chemin à partir du parcours

Pour retrouver la marche ayant conduit du sommet initial au sommet visité, on peut modifier l’algorithme ainsi :

À noter que les marches trouvées n’ont aucune raison d’être les plus courtes possibles.

Propriétés de l’algorithme

Terminaison

Puisque chaque sommet du graphe ne peut être visité qu’une fois, l’algorithme termine.

Correction

L’algorithme du parcours en profondeur est tel qu’il va visiter l’ensemble des sommets atteignables à partir de u.

Pour vérifier cette propriété, on remarque d’abord que l’ensemble des sommets visités par le parcours en profondeur sont en effet atteignables : cela se prouve par récurrence très simplement (u est trivialement atteignable depuis u puis des voisins de sommets atteignables sont eux-mêmes atteignables).

Ensuite il faut vérifier que tous les sommets atteignables sont visités par le parcours en profondeur. Procédons par l’absurde : un sommet atteignable v par définition est tel qu’il existe un chemin y menant depuis u. On regarde sur un tel chemin l’avant dernier sommet. Cet avant dernier sommet n’a pas été visité sinon v aurait été visité. Par récurrence, on en déduit que u n’a pas été visité. Contradiction.

Complexité

Le parcours ne consulte que deux fois chaque arête, avec un nombre d’opérations élémentaires proportionnel à cette quantité. On en déduit que la complexité est en O(|E|).

Des parcours en profondeur

Le parcours en profondeur dont il est question dans le cours n’autorise de visiter chaque sommet du graphe qu’une fois, il permet donc de découvrir l’ensemble des sommets atteignables.

Une autre utilité aux parcours en profondeur est de lister l’ensemble des chemins élémentaires depuis un sommet initial u. Il suffit alors pour cela de modifier l’algorithme de la façon suivante :

Cet algorithme sera très utile lorsque l’on travaillera sur l’algorithme de backtracking.

Publié le

Laisser un commentaire