Vous êtes sur la page 1sur 3

UNIVERSITÉ DE CAEN

UFR Sciences L3 MASS, L3 Maths


Optimisation Combinatoire
TP6 : Graphe orienté: plus court chemin

À un graphe G représenté par liste d’adjacence à partir d’un dictionnaire en Python, on associe un
dictionnaire des distances, c’est à dire un dictionnaire ayant les mêmes clés mais où les valeurs sont les listes
des distances aux sommets adjacents (dans le même ordre). Si on considère le graphe G

1
10 100

30
5 2
10
50 60
4 3
20

il sera représenté en python par


G={1:[2,3,5],2:[],3:[2,4],4:[2],5:[4]}
Gdist={1:[100,30,10],2:[],3:[60,20],4:[10],5:[50]}

Exercice 1. Soient le graphe orienté G1 ci-dessous:


3
0 1
5 1
1
1
5 3 2
2
2 2
4 3
3

et le graphe orienté G2 ci-dessous:

0
1 1
2

2 1

3
4 5
3

Donner les dictionnaires des listes d’ajacence et distances les represésentant en Python.

Exercice 2. On suppose que le graphe G est donné par la liste de ses sommets, et une liste d’arrêtes L
dont les éléments sont des triplets de la forme [s, t, d ]. Un tel triplet représente une arrête s −→ t de
longueur d.

1
2.1 Écrire une fonction creerListeAdjacenceValuee(S,L) qui construit la représentation de G par le dic-
tionnaire des listes d’adjacences et le dictionnaire des listes de distances correpondantes à partir de la
liste des sommets S et la listes d’arrêtes L. Cette fonction renvoi une liste composée des 2 dictionnaires
représentant le graphe et les distances.

2.2 Vérifier que le résultat de cette fonction appliquée aux graphes ci-dessus correspond bien à votre réponse.

Exercice 3. Algorithme de Dijstra. L’algorithme de Dijkstra est un algorithme permettant de calculer la


plus courte distance reliant un sommet d’un graphe orienté muni de distance aux autres sommets du graphe.
De plus on peut récupérer le chemin correspondant à cette distance. Cet algorithme fait parti des algorithme
«glouton», c’est à dire qu’à chaque étape qu’il recherche la meilleur solution «locale» et on montre que cette
stratégie est en fait la meilleur solution «globale». L’idée de l’algorithme est de construire le chemin de
proche en proche c’est à dire qu’à partir d’un sommet x0 du graphe, on va rechercher le successeur x qui est
le plus proche et continuer ainsi de suite. On va utiliser 2 tableaux de taille n nombre de sommet du graphe
G
• un tableau d pour les distances;

• un tableau pere pour les prédecesseurs sur le plus court chemin venant du sommet x0 .

Initialisation (Étape 0):


• Ensemble des sommets traités T = {x0 }.

• Pour tout sommet x, 


 0 si x = x0
d[x] = dα si α est une arête x0 → x
+∞ sinon


 −1 si x = x0
pere[x] = x0 s’il existe une arête α : x0 → x
−1 sinon

(−1 signifiant que le sommet en question n’est pas un successeur immédiat de x0 )

• À l’initialisation, on ne peut accéder qu’aux successeurs immédiats de x0 .

Étape k:
• À l’issue de l’étape k − 1, on a déjà traité k − 1 sommets (hors x0 ): T = {x0 , . . . , xk−1 }. Les deux
tableaux d et pere ont été mis à jour.

• Parmi les sommets non traités, on en choisit un xk tel que d[xk ] soit minimal.

• On ajoute xk à T puis parmi les successeurs immédiats de xk , on teste si la configuration x0 → · · · →


xk → y ne forme pas un chemin plus court de x0 vers y que celui déjà existant. On teste donc si
d[xk ] + dα < d[y] où α est l’arrête xk → y. Si c’est le cas, on met à jour les tableaux d et pere en
posant d[y] = d[xk ] + dα et pere[y] = xk .
On continue à ajouter ainsi des sommets tant qu’il existe des sommets non traités accessibles à partir de
x0 (les sommets inaccessibles y se caractérisent par d[y] = +∞ à la fin de l’algorithme).
Pour chaque graphe donné, décrire le calcul de l’arbre des plus courts chemins à partir du sommet 0 en
utilisant l’algorithme de Dijkstra.

Exercice 4.
4.1. Ecrire une fonction Dijkstra(G,Gdist,s0) qui recoit les données d’un graphe orienté valué G, presenté
par listes d’adjacences, et renvoie le dictionnaire des plus courtes distances de s0 vers les autres sommets
de G.

2
4.2. Calculer la table des distances minimales à partir du sommet s0 = 1 du graphe G ci-dessus. Comparer
avec les résultats du cours.

4.3. Faire de même avec les deux autres graphes du à partir du sommet s0 = 0.

Exercice 5.

5.1. Modifier la fonction de l’exercice 2 afin qu’elle calcule aussi le tableau père représentant l’arbre des plus
courts chemins à partir de s0 . Ici on contruira un dictionnaire pere ayant pour clés les sommets et
pour valeurs les numéros des sommets pères. La fonction renvera une liste composée des 2 dictionnaires
représentant les plus courtes distances et les pères.

5.2. Tester votre fonction pour les graphes et les sommets précédent.

Exercice 6.

6.1. Écrire une fonction reconstituerChemin(pere,x) qui reçoit un arbre représenté par le dictionnaire
pere et un noeud x, et renvoie le cheminement (sous forme de liste) de la racine à ce noeud.

6.2. Tester votre fonction pour les graphes et les sommets précédent.

Vous aimerez peut-être aussi