Chapitre 18: Algorithmes Sur Les Graphes I - Rappels Sur Les Graphes
Chapitre 18: Algorithmes Sur Les Graphes I - Rappels Sur Les Graphes
Chapitre 18: Algorithmes Sur Les Graphes I - Rappels Sur Les Graphes
Un graphe est la donnée d’un ensemble de points appelés sommets et d’un ensemble de lignes
appelés arêtes reliant certains sommets entre eux.
Définition.
Graphe
1
Graphe
2
Graphe
3
Page 1 sur 13
Définition.
• Une chaîne ou un chemin est une liste ordonnée de sommets, deux sommets consécutifs étant
reliés par une arête. La longueur de la chaîne est le nombre d’arêtes parcourues dans cette
chaîne.
• Un cycle est une chaîne dont l’origine et l’extrémité de cette chaîne sont confondus et lorsque
toutes les arêtes sont distinctes.
• Un graphe est dit connexe s’il existe au moins une chaîne entre deux sommets quelconques de
ce graphe.
• Un graphe est dit pondéré si toutes les étiquettes des arêtes sont des réels positifs ou nuls. Ces
réels sont les poids des liaisons entre deux sommets.
• Le poids d’une chaîne est la somme des poids des arêtes composant la chaîne.
a) Description de l’algorithme
Cet algorithme consiste à partir d’un sommet, de visiter le sommet puis ses enfants, puis les enfants de
ses enfants. Pour cela, on utilisera une file et une liste pour marquer les sommets visités. Considérons en
exemple ce graphe :
Page 2 sur 13
Appliquons l’algo au graphe précédent en partant du sommet B .
Page 3 sur 13
Page 4 sur 13
Au final, le parcours en largeur du graphe est : [B,A,D,E,C,F,G,H].
b) Implémentation en Python
Voir TP1
a) Description de l’algorithme
On considère un graphe et un sommet S de départ. L’algorithme de parcours en profondeur fonctionne
comme suit :
— On poursuit un chemin dans le graphe jusqu’à un cul-de-sac ou jusqu’à atteindre un sommet déjà
visité.
— On revient alors sur le dernier sommet où on pouvait suivre un autre chemin et on explore un autre
chemin.
Pour cela, on utilise une pile et deux listes pour marquer les sommets visités et les sommets fermés (qui n’ont
plus de voisins non visités) Prenons l’exemple du graphe précédent :
Page 6 sur 13
Page 7 sur 13
Page 8 sur 13
Au final, on obtient donc le parcours [D,C,A,B,F,E,H,G]
R EMARQUE . Les choix dans la liste étant aléatoires, il y a plusieurs parcours possibles.
b) Implémentation en Python
. Voir TP2
Degré 1 3 2 2 3 1 2 2
Page 9 sur 13
Trions par ordre de degrés décroissants.
Sommet 2 5 3 4 7 8 1 6
Degré 3 3 2 2 2 2 1 1
IV - Algorithme de Dijkstra
Si on souhaite déterminer le plus court chemin entre deux sommets d’un graphe, on peut essayer d’énumérer
tous les chemins possibles entre ces deux sommets et calculer leurs longueurs. Mais, avec un graphe de taille
importante, ceci risque de devenir rapidement impossible.
De ce fait, pour répondre à ce problème, on utilise des algorithmes.
On étudiera ici que le cas particulier où les poids de tous les arcs sont des réels positifs.
En 1959, Edsger Wybe Dijkstra (mathématicien et informaticien néerlandais, 1930 - 2002) propose un
algorithme qui permet de déterminer le plus court chemin entre deux sommets d’un graphe connexe
pondéré (orienté ou non) dont le poids lié aux arêtes est positif.
L’algorithme dit de Dijkstra est basé sur le principe suivant :
Algorithme.
Supposons que l’on cherche le plus court chemin entre une ville A et une ville J .
Tout au long de l’algorithme, on va garder en mémoire le chemin le plus court depuis A pour
chacune des autres villes dans un tableau.
On répète ainsi toujours le même processus :
• On choisit le sommet accessible de distance minimale comme sommet à explorer.
• A partir de ce sommet, on explore ses voisins et on met à jour les distances pour chacun. On ne
met à jour la distance que si elle est inférieure à celle que l’on avait auparavant.
• On répète cela jusqu’à ce que l’on arrive au point d’arrivée ou jusqu’à ce que tous les sommets
aient été explorés.
R EMARQUE . Edsger Wybe Dijkstra a trouvé cet algo en 20 minutes alors qu’il cherchait la meilleure façon
d’aller de Rotterdam à Groningen à la terrasse d’un café.
Implémentons cela de manière formelle : Soit G un graphe connexe dont les arêtes sont pondérées par des
nombres positifs. On note :
• S la liste des sommets du graphe.
• s 0 le sommet du graphe à partir duquel on veut déterminer les plus courts chemins aux autres sommets.
• l (x ; y) le poids de l’arête entre deux sommets x et y.
• δs (x) la longueur d’un chemin du sommet s 0 au sommet x.
• V + (x) la liste des successeurs du sommet x.
• p(x) le prédécesseur du sommet x.
• X la liste des sommets restants à traiter.
Page 10 sur 13
• E la liste des sommets déjà traités.
δs (x 0 ) ← 0
X ←S
E ←;
#On initialise la liste des sommets contenant le plus court chemin depuis s 0 .
chemin =[x 0 ]
Traitement : Tant que X ̸= ; faire # Tant que la liste des sommets restants à traiter n’est pas vide
#On examine tous les successeurs y du sommet x qui ne sont pas traités
δs (y) ← δs (x) + l (x ; y)
p(y) ← x
Fin Si
Fin Pour
E XEMPLE . On considère le graphe connexe suivant représentant le réseau routier d’un région. Chaque arc
représente une route dont le poids est la distance en kilomètres entre deux sommets. Déterminer
l’itinéraire le plus court pour aller de A à H .
Pour faciliter la recherche du plus court chemin, on représente les résultats dans un tableau :
Page 11 sur 13
A B C D E F G H Sommet Commentaires
sélec-
tionné
Page 12 sur 13
Le chemin le plus court pour aller de A vers H est donc A → B → C → H . Sa distance minimale est
24 kilomètres.
Page 13 sur 13