morissardj's Home Page

Home
Langage C

Langage C - Les graphes - forme liste adjacence


Deux types de structures de données sont nécessaires pour traiter de façon agréable le problème : les graphes, qui sont une représentation instinctive et mathématique des réseaux considérés, et les files, qui organisent les éléments d'un ensemble muni d'une relation d'ordre et qui permettront de comparer rapidement les longueurs d'un ensemble de chemins.  

Définition mathématique

ici

Représentation par liste d'ajacence



Algorithme de parcours en largeur

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.

Implémentation

BFS(graphe G, sommet s):
{
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
}
Sur le graphe suivant, cet algorithme va alors fonctionner ainsi:

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.

Algorithme de parcours en profondeur

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.

Implémentation

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
}

source

Cellule.h

fifo.h

fifo.c

graphe.h

graphe.c

main.c