Vous êtes sur la page 1sur 3

Université de Rouen

L3 Informatique
Module : Algorithmique des graphes

Fiche de travaux dirigés n. 5


L’algorithme de Dijkstra et de Bellman-Ford.

1 Algorithme de Dijkstra
Exercice 1 Soit G le graphe orienté et valué suivant donné par sa matrice des poids
 
∞ 2 ∞ 4 ∞ ∞ ∞ ∞
 ∞ ∞ ∞ 1 4 5 ∞ ∞ 
 
 3 ∞ ∞ ∞ ∞ ∞ 1 ∞ 
 
 ∞ ∞ ∞ ∞ ∞ 3 ∞ ∞ 
M =  

 ∞ ∞ ∞ ∞ ∞ ∞ ∞ 1 
 ∞ ∞ 1 ∞ ∞ 1 3 ∞ 
 
 ∞ ∞ ∞ ∞ ∞ ∞ ∞ 2 
∞ ∞ ∞ ∞ 3 ∞ ∞ ∞
Exécutez l’algorithme de Dijkstra, en déroulant toutes les étapes, pour calculer les
plus courtes distances et les plus courts chemins depuis le sommet 1.
Exercice 2 Soit G le graphe orienté et valué suivant donné par sa matrice des poids
 
∞ 6 −2 ∞ ∞
 ∞ ∞ ∞ 1 ∞ 
 
 ∞ ∞ ∞ 2 3 
M =  

 ∞ ∞ ∞ ∞ ∞ 
 ∞ −4 ∞ ∞ ∞ 
∞ ∞ ∞ ∞ ∞
L’objectif de cet exercice est de montrer que l’algorithme de Dijkstra n’est pas valide
si le fonction de poids admet de valeurs négatives même si le graphe ne possède pas
de circuit absorbant.
1. Vérifiez que G possède pas de circuit absorbant.
2. Appliquez l’algorithme de Dijkstra au graphe G, à partir du sommet 1, et
vérifiez que le résultat obtenu n’est pas correct.
3. L’algorithme de Bellman-Ford permet de calculer les plus courtes distances
et les plus courts chemins depuis une source pour un graphe orienté et valué
par une fonction de poids quelconque. Il permet aussi de tester si le graphe
possède de circuits absorbants. Il utilise les mêmes structures des données
et la procédure Relâcher utilisées dans l’algorithme de Dijkstra Appliquez au
graphe G, en déroulant toutes les étapes, l’algorithme de Bellman-Ford.
2 Une implantation efficace de l’algorithme de Dijkstra
Un tas est un tableau T [1 . . . n], n ≥ 1, contenant des éléments auquels est associé
une priorité, que l’on note p(T [i]), vérifiant la propriété :
(p(T [i]) ≤ p(T [2i])) et (p(T [i]) ≤ p(T [2i + 1])), ∀1 ≤ i ≤ ⌊n/2⌋,
La notation ⌊n/2⌋ signifie la partie entière inférieure de n/2.
Remarque 2.1 On peut représenter un tas T [1 . . . n] par une arborescence
étiquettée HT = (S, A, r) où S = {1, . . . , n} est l’ensemble de sommets, r = 1
est la racine, l’étiquette du sommet i vaut p(T [i]), ∀1 ≤ i ≤ n et l’ensemble d’arcs
est A = {(i, 2i), (i, 2i + 1) | 1 ≤ i ≤ ⌊n/2⌋}.
Les deux principales opérations que l’un peut effectuer sur un tas T sont celles
d’insertion et de suppression d’un élément. Dans le deux cas, le résultat des
opérations doit être un tas. La complexité de ces deux opérations est donnée par la
hauteur de l’arborescence.
Exercice 3 Dessinez l’arborescence, dont les éléments sont les entiers de 1 à n,
donnée par le tableau :
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
et dont les priorités des élements dont données par le tableau :
3 5 7 10 12 8 10 12 15
1 2 3 4 5 6 7 8 9
En déroulant toutes les étapes, insérez dans T un élément de priorité 2 et ensuite
supprimez l’élément d’indice 2.
On peut obtenir un’implantation efficace de l’algorithme de Dijkstra, en gérant les
sommets du graphe avec un tas. Dans ce tas, la priorité du sommet u est donnée
par d[u]. On utilisera la structure des données suivante :

T ype Cellule = Enregistrement


sommet : Elément;
poids : Réel;
suiv : ↑Cellule
F in;
T ype Acellule = ↑Cellule;
T ype GrapheD = Enregistrement
n : Entier;
L : T ableau[1..n] de Acellule;
d : T ableau[1..n] d′ Entier;
N oeudT as : T ableau[1..n] d′ Entier
F in;

2
pour le graphe, et

T ype T as = Enregistrement
dern : Entier;
T ab : T ableau[1..n] d′ Entier
F in;

pour le tas. Dans cette structure des données, si u est un sommet du graphe,
G.N oeudT as[u] est l’indice dans le tas du sommet u et si T est une variable de type
tas, T.dern est l’indice du dernier élément du tableau T.T ab (cela veut dire que le
tableau T.T ab est utilisé partiellement).

d L N oeudT as T.T ab
1 1
2 2

u a a u

v b b v

2 2

Exercice 4 Soit T : T as et soit G : GrapheD. Ecrivez :

1. Une procédure Initialisation qui initialise G et T selon l’algorithme de Dijkstra.

2. Une procedure Echange qui interchange deux éléments de T en mettant à jour


les indices des sommets dans G.

3. Une fonction Priorité qui affecte à chaque élément de T sa priorité.

4. Une procédure Verslehaut qui déplace, à sa bonne place, vers le haut un


élément de T .

5. Une procédure Verslebas qui déplace, à sa bonne place, vers le bas un élément
de T .

6. Utilisez les procédures et la fonction que vous venez d’écrire pour écrire la
procédure Dijkstra, qui implemente l’algorithme de Dijkstra.

7. Evaluez la complexité de la procédure Dikstra.

Vous aimerez peut-être aussi