Langage C - Les graphes - forme liste adjacence |
Cet algorithme diffère de l'algorithme de parcours en profondeur
par le fait que, à partir d'un sommet S, il liste d'abord les voisins
de S pour ensuite les explorer un par un. Ce mode de fonctionnement
utilise donc une file FIFO dans laquelle il prend le premier sommet et place en dernier ses voisins non encore explorés.
Si le graphe est cyclique, il faudra en outre marquer les sommets
déjà visités pour que l'algorithme puisse se
terminer.
BFS(graphe G, sommet s):Sur le graphe suivant, cet algorithme va alors fonctionner ainsi:
{
f=CreerFile();
Enfiler(f, s);
debut
TANT-QUE NON FileVide(f) FAIRE
x=Défiler(f);
Marquer(x)
TANT-QUE ExisteFils(x) FAIRE
z=FilsSuivant(x);
SI NonMarqué(z) Enfiler(f, z);
FIN-TANT-QUE
FIN-TANT-QUE
fin
}
Il explore dans l'ordre les sommets A, B, C, E, D, F, G, contrairement à l'algorithme de parcours en profondeur qui cherchait dans cet ordre: A, B, D, F, E, C, G. |
C'est un algorithme de recherche qui progresse à partir d'un sommet
S en s'appelant récursivement pour chaque sommet voisin de S.
Le nom d'algorithme en profondeur est du au fait que, contrairement à l'algorithme de parcours en largeur,
il explore en fait « à fond » les chemins un par uns: pour chaque
sommet, il prend le premier sommet voisin jusqu'à ce qu'un sommet n'aie
plus de voisins (ou que tout ses voisins soient marqués), et revient
alors au sommet père.
Si G n'est pas un arbre ou s'il y a une composante cyclique,
l'algorithme pourrait tourner indéfiniment, c'est pour cela que l'on
doit en outre marquer chaque sommet déjà parcouru, et ne parcourir que
les sommets pas encore marqués.
Enfin, on notera qu'il est tout à fait possible de
l'implémenter itérativement à l'aide d'une pile
LIFO contenant les sommets à explorer: on dépile un
sommet et on empile ses voisins pas encore explorés.
DFS (graphe G, sommet s):
{
Marquer(S);
debut
POUR CHAQUE élément sfils de Voisin(s) FAIRE
SI NonMarqué(sfils)
ALORS DFS(G,sfils);
FIN-SI
FIN-POUR
fin
}