Académique Documents
Professionnel Documents
Culture Documents
Utilité:
Un parcours sert dans la résolution d'un certain nombre de problèmes parmi
lesquels :
- Connexité et forte connexité;
- Existence d'un circuit ou d'un cycle (ce qu’on appelle tri topologique);
- Calcul des plus courts chemins (notamment l’algorithme de Dijkstra);
- Calcul d'un arbre couvrant (notamment l’algorithme de Prim);
Exploration d’un graphe
Définition:
On appelle exploration/parcours un procédé déterministe ( un algorithme) consistant à
explorer les sommets d'un graphe de proche en proche à partir d'un sommet initial.
La notion d’exploration/parcours peut être utiliser dans les graphes orientés et non-
orientés.
Définition:
Le sommet de départ fixé à l’avance, dont on souhaite visités tous les descendants est
appelé racine d’exploration.
Exploration d’un graphe
Définition:
Un parcours de racine r est une suite L de sommets tel que :
- r est le premier sommet de L.
- Tout les sommets sauf la racine est adjacent à un sommet placé avant lui dans la liste.
Définition:
Soient G = (S, A) un graphe non-pondéré, x et y deux sommets de G. On pose d(x, y) =
longueur d’un plus court chemin (chaine) entre x et y (en nombre d’arcs ou arêtes). d(x, y)
s’appelle distance entre x et y.
Exemple:
2
3
Exploration d’un graphe
Définition:
On appelle partition en couches associée à un sommet source r appelé racine, la suite
d’ensembles définis exactement comme suit :
- C0 = {r}
- C1 = {x ∈ S / d(x,r) = 1}
⋮
- Cn = {x ∈ S / d(x,r) = n}
Cas orienté: On définit les couches de la même manière, dont les descendants d’un
sommet représentent ses successeurs.
Peut-on savoir si un
graphe représenté par
sa liste d’adjacence est
biparti? est connexe?
Parcours en Largeur
Parcours en Largeur ?
Définition:
Le parcours en largeur (ou BFS pour Breadth First Search) débute à partir d'un nœud
source. Puis il liste tous les voisins de la source, pour ensuite les explorer un par un
dans l’ordre. Ce mode de fonctionnement utilise donc une file dans laquelle il prend le
premier sommet et place en dernier ses voisins non encore explorés. Les nœuds déjà
visités sont marqués afin d'éviter qu'un même nœud soit exploré plusieurs fois.
Ce problème peut être vu comme un plus court chemin, mais notre graphe implicite
est non pondéré contrairement aux autres algorithmes "classiques" de plus court
chemin où le graphe est pondéré (positivement ou négativement). Cela revient donc à
trouver un chemin entre l'entrée et la sortie comportant un minimum de nœuds
possible (vu que les arcs ont chacun une distance de 1 unité).
Parcours en Largeur
Utilité:
Le BFS sert à :
trouver le plus court chemin dans un graphe non pondéré;
Déterminer si le graphe est connexe;
Déterminer si le graphe est biparti, etc.
Parcours en Largeur
Principe:
Le BFS, visite les nœuds du graphe par ordre de profondeur. C'est-à-dire que
l'algorithme va d'abord visiter les nœuds à une profondeur de 1 par rapport au
nœud de départ, puis à une profondeur de 2, de 3, etc. On parcourt le graphe
"couche par couche" .
Algorithme:
1- mettre le nœud source dans la file ;
2- retirer le nœud du début de la file pour le traiter ;
3- mettre tous ses voisins non explorés dans la file (à la fin) ;
4- si la file n'est pas vide reprendre à l'étape 2.
Parcours en Largeur
Définition:
Un sommet est dit marqué s’il a été placé dans une couche Ci .
2 3
1 1 Ou bien 1 1
Définition:
Un sommet est dit exploré lorsqu’on aura marqué tous les voisins.
2 2 2
1 1 1
3 3 3
Ou bien
0 0 3
2 2 2
0 2 2
1 1 1
0 0 3
3 3 3
Parcours en Largeur
Propriété:
Lors d’un parcours en largeur on applique la règle: premier marqué premier exploré.
Pour construire les couches, on explore les sommets en respectant l’ordre dans lequel
ils ont été marqués. La gestion des sommets est réalisable au moyen d’une structure de
données appelée file.
Définition:
Une file (queue) est une structure de données basée sur FIFO. Ce qui veut dire que les
premiers éléments ajoutés à la file sont les premiers à être récupérés.
Exemple:
10
2 3
8
4 5
7 9
6
0
0 0 10
2 3
0
0
0 8
4 5
0 0 0
7 9
6
0
1
0
0 0 10
2 3
0
0
0 8
4 5
0 0 0
7 9
6
0
1
0
1 0 10
2 3
0
0
0 8
4 5
0 0 0
7 9
6
0
1
0
1 0 10
2 3
0
0
0 8
4 5
0 0 0
7 9
6
0
1
0
1 1 10
2 3
0
0
0 8
4 5
0 0 0
7 9
6
0
1
0
1 1 10
2 3
0
0
0 8
4 5
0 0 0
7 9
6
0
1
0
2 1 10
2 3
0
0
0 8
4 5
0 0 0
7 9
6
0
1
0
1 1 10
2 3
0
0
0 8
4 5
0 0 0
7 9
6
0
1
0
1 1 10
2 3
0
0
2 8
4 5
0 0 0
7 9
6
0
1
0
1 1 10
2 3
0
0
2 8
4 5
0 0 0
7 9
6
0
1
0
1 1 10
2 3
0
2
2 8
4 5
0 0 0
7 9
6
0
1
0
1 1 10
2 3
0
2
2 8
4 5
0 0 0
7 9
6
0
1
0
1 1 10
2 3
0
2
2 8
4 5
0 0 0
7 9
6
0
1
2
1 1 10
2 3
0
2
2 8
4 5
0 0 0
7 9
6
0
1
2
1 1 10
2 3
0
2
2 8
4 5
0 0 0
7 9
6
0
1
2
1 1 10
2 3
0
2
2 8
4 5
0 0 0
7 9
6
0
1
2
1 1 10
2 3
0
2
2 8
4 5
0 0 0
7 9
6
0
1
2
1 1 10
2 3
0
2
2 8
4 5
3 0 0
7 9
6
0
1
2
1 1 10
2 3
0
2
2 8
4 5
3 0 0
7 9
6
0
1
2
1 1 10
2 3
0
2
2 8
4 5
3 0 0
7 9
6
0
1
2
1 1 10
2 3
0
2
2 8
4 5
3 0 0
7 9
6
0
1
2
1 1 10
2 3
0
2
2 8
4 5
3 0 0
7 9
6
0
1
2
1 1 10
2 3
0
2
2 8
4 5
3 0 0
7 9
6
0
1
2
1 1 10
2 3
3
2
2 8
4 5
3 0 0
7 9
6
0
1
2
1 1 10
2 3
3
2
2 8
4 5
3 0 0
7 9
6
0
1
2
1 1 10
2 3
3
2
2 8
4 5
3 0 0
7 9
6
0
1
2
1 1 10
2 3
3
2
2 8
4 5
3 0 0
7 9
6
0
1
2
1 1 10
2 3
3
2
2 8
4 5
3 4 0
7 9
6
0
1
2
1 1 10
2 3
3
2
2 8
4 5
3 4 0
7 9
6
0
1
2
1 1 10
2 3
3
2
2 8
4 5
3 4 0
7 9
6
0
1
2
1 1 10
2 3
3
2
2 8
4 5
3 4 0
7 9
6
0
1
2
1 1 10
2 3
3
2
2 8
4 5
3 4 4
7 9
6
0
1
2
1 1 10
2 3
3
2
2 8
4 5
3 4 4
7 9
6
0
1
2
1 1 10
2 3
3
2
2 8
4 5
3 4 4
7 9
6
Conclusion 0
1 𝑑 𝑥, 1 = 0
1 1
2 3 𝑑 𝑥, 1 = 1
2
2 2
4 5 10 𝑑 𝑥, 1 = 2
3
3
8 𝑑 𝑥, 1 = 3
6
1 1
2 3
2
2 2
4 5 10
3
3
8
6
Graphe connexe
4 4
7 9
0
1
1 1
2 3
2
2 2
4 5 10
3
3
8
6
Graphe connexe
4 4
7 9
Tester si un graphe est biparti en utilisant le parcours en largeur
10
2 3
8
4 5
7 9
6
0
1
1 1
2 3
2
2 2
1
4 5 0
3 3
8
6
4 4
7 9
1 1
2 3
2
2 2
1
4 5 0
3 3
8
6
4 4
7 9
1 1
2 3
2
2 2
1
4 5 0
3 3
8
6
4 4
7 9
1 1
2 3
2
2 2
1
4 5 0
3 3
8
6
4 4
7 9
1 1
2 3
2
2 2
1
4 5 0
3 3
8
6
4 4
7 9
1 1
2 3
2
2 2
1
4 5 0
3 3
8
6
4 4
7 9
2
4
3 5
7
6
8 1
0
1 1
2 3
2
2 2
1
4 5 0
3 3
8
6
4 4
7 9
1 1
2 3
2
2 2
1
4 5
0
3
3
8
6
4 4
7 9 Liste d’adjacence décroissante
0
1 1
2 3
2
2 2
1
4 5
0
3 3
8
6
4 4
7 9
Exploration d’un graphe
Problématique:
Vous vous trouvez dans un labyrinthe contenant de nombreux chemins
possibles, et vous cherchez la sortie alors que vous ne connaissez
aucunes indications sur ce labyrinthe.
Exploration d’un graphe
Dans notre labyrinthe, nous essayons d'abord de marcher tout droit jusqu'à se
retrouver coincé
Exploration d’un graphe
Encore une fois, nous essayons d'aller tout droit et de tourner à gauche
jusqu'à nous retrouver bloqués.
Exploration d’un graphe
Encore une fois, nous essayons d'aller tout droit et de tourner à gauche
jusqu'à nous retrouver bloqués.
Exploration d’un graphe
C’est terminé!
Situation 1
Parcours en Profondeur
Parcours en Profondeur
Définition:
Le parcours d’un graphe en profondeur (ou plus communément DFS pour Depth
First Search) se réalise en partant d’un sommet arbitraire v à visiter, et en
parcourant d’abord un de ses voisins u et tous ses “descendants” (c’est-à-dire
tous les sommets accessibles à partir de u) avant de traiter le voisin suivant de
v. Une fois ces descendants explorés, on applique le même traitement au
prochain voisin de v non encore visité, et ainsi de suite jusqu’à ce que tous les
sommets aient été couverts. On manipulera tout au long de notre parcours une
liste résultat, enregistrant les identifiants des sommets au fur et à mesure qu’on
les découvre.
Parcours en Profondeur
Implémentation
On peut implémenter un DFS de deux manières différentes, même si on
a plutôt tendance à le coder de manière récursive car le code est plus
court et plus intuitif.
Principe:
Le parcours en profondeur permet de parcourir un graphe en utilisant le principe
de la récursivité. Ce parcours visite les nœuds du graphe les plus "profonds" en
premier (c'est-à-dire les plus éloignés du nœud de départ), avant de "remonter"
progressivement dans le graphe.
Parcours en Profondeur
Algorithme:
On considère un graphe dont tous les sommets sont initialement non découverte
(couleur est blanche). Le parcours en profondeur consiste à:
- Choisir un sommet de départ s et le marquer comme découvert.
- Suivre un chemin issu de s aussi loin que possible en marquant les sommets au fur et à
mesure qu’on les découvrent.
- A la fin du chemin (marqué en noir) revenir au dernier choix du sommet et prendre une
autre direction.
Dans les sommets, on utilise les champs : couleur, père, découvert, fin.
Parcours en Profondeur
Implémentation de l’algorithme DFS récursivement
10
2 3
8
4 5
7 9
6
./.
./. ./. 10
2 3
./. ./.
./. 8
4 5
./. ./.
7 9
6
./.
0/.
./.
./. ./. 10
2 3
./. ./.
./. 8
4 5
./. ./.
7 9
6
./.
0/.
./.
1/. ./. 10
2 3
./. ./.
./. 8
4 5
./. ./.
7 9
6
./.
0/.
./.
1
1/. ./. 10
2 3
./. ./.
./. 8
4 5
./. ./.
7 9
6
./.
0/.
./.
1
1/. ./. 10
2 3
./. ./.
2/. 8
4 5
./. ./.
7 9
6
./.
0/.
./.
1
1/. ./. 10
2 3
./. ./.
2
2/. 8
4 5
./. ./.
7 9
6
./.
0/.
./.
1
1/. ./. 10
2 3
./. ./.
2
2/. 8
4 5
./. ./.
7 9
6
3/.
0/.
./.
1
1/. ./. 10
2 3
./. ./.
2
2/. 8
4 5
./. ./.
7 9
6
4
3/.
0/.
./.
1
1/. ./. 10
2 3
./. ./.
2
2/. 8
4 5
./. ./.
7 9
6
4
3/.
0/.
./.
1
1/. ./. 10
2 3
./. ./.
2
2/. 8
4 5
./. ./.
7 9
6
4
3/4
0/.
./.
1
1/. ./. 10
2 3
./. ./.
2
2/. 8
4 5
./. ./.
7 9
6
4
3/4
0/.
./.
1
1/. ./. 10
2 3
./. ./.
2
2/5 8
4 5
./. ./.
7 9
6
4
3/4
0/.
./.
1
1/. ./. 10
2 3
./. ./.
2
2/5 8
4 5
./. ./.
7 9
6
4
3/4
0/.
./.
1
1/. ./. 10
2 3
6/. ./.
2
2/5 8
4 5
./. ./.
7 9
6
4
3/4
0/.
./.
1
1/. ./. 10
2 3
2 ./.
6/.
2
2/5 8
4 5
./. ./.
7 9
6
4
3/4
0/.
./.
1
1/. 7/. 10
2 3
2 ./.
6/.
2
2/5 8
4 5
./. ./.
7 9
6
4
3/4
0/.
./.
1 5
1/. 7/. 10
2 3
2 ./.
6/.
2
2/5 8
4 5
./. ./.
7 9
6
4
3/4
0/.
./.
1 5
1/. 7/8 10
2 3
2 ./.
6/.
2
2/5 8
4 5
./. ./.
7 9
6
4
3/4
0/.
./.
1 5
1/. 7/8 10
2 3
2 ./.
6/.
2
2/5 8
4 5
./. ./.
7 9
6
4
3/4
0/.
./.
1 5
1/. 7/8 10
2 3
2 ./.
6/.
2
2/5 8
4 5
./. ./.
7 9
6
4
3/4
0/.
./.
1 5
1/. 7/8 10
2 3
2 ./.
6/9
2
2/5 8
4 5
./. ./.
7 9
6
4
3/4
0/.
./.
1 5
1/. 7/8 10
2 3
2 ./.
6/9
2
2/5 8
4 5
./. ./.
7 9
6
4
3/4
0/.
./.
1 5
1/10 7/8 10
2 3
2 ./.
6/9
2
2/5 8
4 5
./. ./.
7 9
6
4
3/4
0/.
./.
1 5
1/10 7/8 10
2 3
2 ./.
6/9
2
2/5 8
4 5
./. ./.
7 9
6
4
3/4
0/11
./.
1 5
1/10 7/8 10
2 3
2 ./.
6/9
2
2/5 8
4 5
./. ./.
7 9
6
4
3/4
0/11
./.
1 5
1/10 7/8 10
2 3
2 ./.
6/9
2
2/5 8
4 5
12/.
./.
7 9
6
4
3/4
0/11
./.
1 5
1/10 7/8 10
2 3
2 13/.
6/9
2
2/5 8
4 5
12/.
./.
7 9
6
4
3/4
0/11
./.
1 5
1/10 7/8 10
2 3
2 7
13/.
6/9
2
2/5 8
4 5
12/.
./.
7 9
6
4
3/4
0/11
./.
1 5
1/10 7/8 10
2 3
2 7
13/.
6/9
2
2/5 8
4 5
12/.
14/.
7 9
6
4
3/4
0/11
./.
1 5
1/10 7/8 10
2 3
2 7
13/.
6/9
2
2/5 8
4 5
12/. 8
14/.
7 9
6
4
3/4
0/11
./.
1 5
1/10 7/8 10
2 3
2 7
13/.
6/9
2
2/5 8
4 5
12/. 8
14/.
7 9
6
4
3/4
0/11
./.
1 5
1/10 7/8 10
2 3
2 7
13/.
6/9
2
2/5 8
4 5
12/. 8
14/15
7 9
6
4
3/4
0/11
./.
1 5
1/10 7/8 10
2 3
2 7
13/.
6/9
2
2/5 8
4 5
12/. 8
14/15
7 9
6
4
3/4
0/11
16/.
1 5
1/10 7/8 10
2 3
2 7
13/.
6/9
2
2/5 8
4 5
12/. 8
14/15
7 9
6
4
3/4
0/11
1
8
16/.
1 5
1/10 7/8 10
2 3
2 7
13/.
6/9
2
2/5 8
4 5
12/. 8
14/15
7 9
6
4
3/4
0/11
1
8
16/.
1 5
1/10 7/8 10
2 3
2 7
13/.
6/9
2
2/5 8
4 5
12/. 8
14/15
7 9
6
4
3/4
0/11
1
8
16/17
1 5
1/10 7/8 10
2 3
2 7
13/.
6/9
2
2/5 8
4 5
12/. 8
14/15
7 9
6
4
3/4
0/11
1
8
16/17
1 5
1/10 7/8 10
2 3
2 7
13/.
6/9
2
2/5 8
4 5
12/. 8
14/15
7 9
6
4
3/4
0/11
1
8
16/17
1 5
1/10 7/8 10
2 3
2 7
13/18
6/9
2
2/5 8
4 5
12/. 8
14/15
7 9
6
4
3/4
0/11
1
8
16/17
1 5
1/10 7/8 10
2 3
2 7
13/18
6/9
2
2/5 8
4 5
12/. 8
14/15
7 9
6
4
3/4
0/11
1
8
16/17
1 5
1/10 7/8 10
2 3
2 7
13/18
6/9
2
2/5 8
4 5
12/. 8
14/15
7 9
6
4
3/4
0/11
1
8
16/17
1 5
1/10 7/8 10
2 3
2 7
13/18
6/9
2
2/5 8
4 5
12/19 8
14/15
7 9
6
4
3/4
1
10
2 3
8
4 5
7 9
6
Forêt
1 7
2
8
4 5
9 10
6 3
10
2 3
8
4 5
7 9
6
PS 1 3 5 5 6 9 10 12 14 15 17
LS 2 3 4 5 6 1 3 6 2 6 8 9 10 7 3 9
Parcours en Profondeur
Implémentation de l’algorithme DFS en utilisant les piles
Principe
la gestion des sommets est réalisable à l’aide d’une structure de données
appelée pile. Une pile est une structure de données basée sur le principe
dernier entré, premier sortie (LIFO).
2 1 Dépiler
Empiler
Obj4 Obj3 Obj3
Obj3 Obj4
Obj2 Obj2
Obj1 Obj1
Parcours en Profondeur
Implémentation de l’algorithme DFS en utilisant les piles
Utilité:
Un parcours en profondeur permet de:
- Trouver tous les sommets atteignables depuis un sommet initial u, c’est-à-dire
l’ensemble des sommets v pour lesquels il existe une marche menant de u à v;
- Identifie les sous arbres et leurs racines;
- Déterminer les composantes fortement connexes;
- Existence d'un circuit ou d'un cycle,etc.
Exemple 2:
Considérons le graphe orienté non pondéré suivant:
10
2 3
8
4 5
7 9
6
1 2 3 4 5 6 7 8 9 10
Itération 0 Faux Faux Faux Faux Faux Faux Faux Faux Faux Faux
Tableau de marquage des sommets
1 2 3 4 5 6 7 8 9 10
Itération 0 Faux Faux Faux Faux Faux Faux Faux Faux Faux Faux
Itération 1 Vrai Faux Faux Faux Faux Faux Faux Faux Faux Faux
Tableau de marquage des sommets
1 2 3 4 5 6 7 8 9 10
Itération 0 Faux Faux Faux Faux Faux Faux Faux Faux Faux Faux
Itération 1 Vrai Faux Faux Faux Faux Faux Faux Faux Faux Faux
Itération 2 Vrai Vrai Faux Faux Faux Faux Faux Faux Faux Faux
Tableau de marquage des sommets
1 2 3 4 5 6 7 8 9 10
Itération 0 Faux Faux Faux Faux Faux Faux Faux Faux Faux Faux
Itération 1 Vrai Faux Faux Faux Faux Faux Faux Faux Faux Faux
Itération 2 Vrai Vrai Faux Faux Faux Faux Faux Faux Faux Faux
Itération 3 Vrai Vrai Faux Vrai Faux Faux Faux Faux Faux Faux
Tableau de marquage des sommets
1 2 3 4 5 6 7 8 9 10
Itération 0 Faux Faux Faux Faux Faux Faux Faux Faux Faux Faux
Itération 1 Vrai Faux Faux Faux Faux Faux Faux Faux Faux Faux
Itération 2 Vrai Vrai Faux Faux Faux Faux Faux Faux Faux Faux
Itération 3 Vrai Vrai Faux Vrai Faux Faux Faux Faux Faux Faux
Itération 4 Vrai Vrai Faux Vrai Faux Vrai Faux Faux Faux Faux
Tableau de marquage des sommets
1 2 3 4 5 6 7 8 9 10
Itération 0 Faux Faux Faux Faux Faux Faux Faux Faux Faux Faux
Itération 1 Vrai Faux Faux Faux Faux Faux Faux Faux Faux Faux
Itération 2 Vrai Vrai Faux Faux Faux Faux Faux Faux Faux Faux
Itération 3 Vrai Vrai Faux Vrai Faux Faux Faux Faux Faux Faux
Itération 4 Vrai Vrai Faux Vrai Faux Vrai Faux Faux Faux Faux
Itération 5 Vrai Vrai Faux Vrai Vrai Vrai Faux Faux Faux Faux
Tableau de marquage des sommets
1 2 3 4 5 6 7 8 9 10
Itération 0 Faux Faux Faux Faux Faux Faux Faux Faux Faux Faux
Itération 1 Vrai Faux Faux Faux Faux Faux Faux Faux Faux Faux
Itération 2 Vrai Vrai Faux Faux Faux Faux Faux Faux Faux Faux
Itération 3 Vrai Vrai Faux Vrai Faux Faux Faux Faux Faux Faux
Itération 4 Vrai Vrai Faux Vrai Faux Vrai Faux Faux Faux Faux
Itération 5 Vrai Vrai Faux Vrai Vrai Vrai Faux Faux Faux Faux
Itération 6 Vrai Vrai Vrai Vrai Vrai Vrai Faux Faux Faux Faux
Conclusion:
- Il n’existe aucun chemin à partir du sommet 1 vers les sommets 3, 7, 8, 9 et 10.
- Elle n’existe aucune arborescence à partir de 1.
- Il existe un sous-graphe sous forme d’une arborescence à partir de 1 ( formée
par les sommets qui sont marqués).
4 5
6 3
d f
e
c
j h
a
b i
g
e
c
j h
a
b i
g
Problématique:
Supposons qu’on souhaite mettre en place un réseau informatique entre les villes a,
b, c, d, e et f. Une estimation des coûts d’installation entre certaines de ces villes à
donnée les valeurs suivantes.
b 4 e
1
3 6
a 3 2
d
7 10
3
c 5
f
On souhaite choisir les liaisons à effectuer afin que toutes les villes soient reliées au
réseau tout en minimisant le coût total.
Arbres couvrants
Définition:
Soit G un graphe à n sommets, alors on a les équivalences suivantes :
1- G est un arbre.
2- G est sans cycle et connexe.
3- G est sans cycle et comporte n − 1 arêtes.
4- G est connexe et comporte n − 1 arêtes.
5- Chaque pair de sommets x, y distincts est relié par une seule chaine simple
et le graphe est sans boucles.
Définition:
Soit G un graphe orienté ou non. Un arbre couvrant est un sous-graphe de G
qui est un arbre.
Arbres couvrants de poids
minimal
Définition:
Un graphe (orienté ou non) G = (S, A) est dit valué ( ou bien pondéré) s’il est muni
d’une application v: A → ℝ, (x, y) ↦ v(x, y) appelée valuation.
On note G = (S, A, v) un graphe muni d’une valuation v.
Utilité:
Les graphes valués servent à résoudre de nombreux problèmes d’optimisation La
valuation peut représenter une distance, un temps, un coût...
Arbres couvrants de poids
minimal
A partir de la valuation d’un arc/arête, on peut définir la valuation d’un chemin / chaine :
c’est la somme des valuations des arcs/arêtes qui composent le chemin/chaine.
Définition:
Soit c(x, y) un chemin/chaîne dans G du sommet x vers y. La valuation ou poids du
chemin c(x, y) est v(x, y) = σu ∈ c(x,y) v(u).
Si le graphe est valué, on définit le poids de l’arbre couvrant comme étant la somme
des poids de ses arêtes (ou arcs dans le cas orienté).
b 4 e
1
3 6
a 3 2
d
7 10
3
c 5
f
a 3 2
d
7 10
3
c 5
f
a 3 2
d
7 10
3
c 5
f
a 3 2
d
7 10
3
c 5
f
Principe :
On construit un sous-graphe en ajoutant des arêtes une par une. A chaque
étape, on cherche l’arête de plus petite valuation.
Algorithme :
S: ensemble des sommets, E: ensemble des arêtes et v les valuations des
arêtes.
F ← ∅ (F ensemble des arêtes de l’arbre couvrant)
Trier l’ensemble des arêtes de G pour les valuations croissantes
pour a ∈ E faire
si F ∪ {a} ne forme pas un cycle (acyclique)
F ←F ∪ {a}
fin si
fin pour
Exemple 4:
Considérons le graphe non orienté pondéré suivant:
a 3 c
7 4
4
b 1 e
9 9
d 5 f
Arêtes du graphe G (b,e) (a,c) (a,e) (c,e) (d,f) (a,b) (d,e) (e,f)
Poids 1 3 4 4 5 7 9 9
Etape 2: on construit l’arbre couvrant en prenant les arêtes les uns après les
autres dans l’ordre, en les ajoutant à l’arbre si elle ne créent pas de cycle.
a 3 c
7 4
4
b 1 e
9 9
d 5 f
Arêtes du graphe G (b,e) (a,c) (a,e) (c,e) (d,f) (a,b) (d,e) (e,f)
Poids 1 3 4 4 5 7 9 9
a 3 c
7 4
4
b 1 e
9 9
d 5 f
Arêtes du graphe G (b,e) (a,c) (a,e) (c,e) (d,f) (a,b) (d,e) (e,f)
Poids 1 3 4 4 5 7 9 9
a 3 c
7 4
4
b 1 e
9 9
d 5 f
Arêtes du graphe G (b,e) (a,c) (a,e) (c,e) (d,f) (a,b) (d,e) (e,f)
Poids 1 3 4 4 5 7 9 9
a 3 c
7 4
4
b 1 e
9 9
d 5 f
Arêtes du graphe G (b,e) (a,c) (a,e) (c,e) (d,f) (a,b) (d,e) (e,f)
Poids 1 3 4 4 5 7 9 9
a 3 c
7 4
4
b 1 e
9 9
d 5 f
Arêtes du graphe G (b,e) (a,c) (a,e) (c,e) (d,f) (a,b) (d,e) (e,f)
Poids 1 3 4 4 5 7 9 9
a 3 c
7 4
4
b 1 e
9 9
d 5 f
Arêtes du graphe G (b,e) (a,c) (a,e) (c,e) (d,f) (a,b) (d,e) (e,f)
Poids 1 3 4 4 5 7 9 9
a 3 c
7 4
4
b 1 e
9 9
d 5 f
Arêtes du graphe G (b,e) (a,c) (a,e) (c,e) (d,f) (a,b) (d,e) (e,f)
Poids 1 3 4 4 5 7 9 9
a 3 c
7 4
4
b 1 e
9 9
d 5 f
Arêtes du graphe G (b,e) (a,c) (a,e) (c,e) (d,f) (a,b) (d,e) (e,f)
Poids 1 3 4 4 5 7 9 9
7 4
4
b 1 e
9 9
d 5 f
a 3 c
b 1 e
d 5 f
Que se passe-t-il si l’on inverse l’ordre des arêtes qui ont le même poids ?
Arêtes du graphe G (b,e) (a,c) (c,e) (a,e) (d,f) (a,b) (e,f) (d,e)
Poids 1 3 4 4 5 7 9 9
Etape 2: on construit l’arbre couvrant en prenant les arêtes les uns après les
autres dans l’ordre, en les ajoutant à l’arbre si elle ne créent pas de cycle.
a 3 c
7 4
4
b 1 e
9 9
d 5 f
Arêtes du graphe G (b,e) (a,c) (c,e) (a,e) (d,f) (a,b) (e,f) (d,e)
Poids 1 3 4 4 5 7 9 9
a 3 c
7 4
4
b 1 e
9 9
d 5 f
Arêtes du graphe G (b,e) (a,c) (c,e) (a,e) (d,f) (a,b) (e,f) (d,e)
Poids 1 3 4 4 5 7 9 9
a 3 c
7 4
4
b 1 e
9 9
d 5 f
Arêtes du graphe G (b,e) (a,c) (c,e) (a,e) (d,f) (a,b) (e,f) (d,e)
Poids 1 3 4 4 5 7 9 9
a 3 c
7 4
4
b 1 e
9 9
d 5 f
Arêtes du graphe G (b,e) (a,c) (c,e) (a,e) (d,f) (a,b) (e,f) (d,e)
Poids 1 3 4 4 5 7 9 9
a 3 c
7 4
4
b 1 e
9 9
d 5 f
Arêtes du graphe G (b,e) (a,c) (c,e) (a,e) (d,f) (a,b) (e,f) (d,e)
Poids 1 3 4 4 5 7 9 9
a 3 c
7 4
4
b 1 e
9 9
d 5 f
Arêtes du graphe G (b,e) (a,c) (c,e) (a,e) (d,f) (a,b) (e,f) (d,e)
Poids 1 3 4 4 5 7 9 9
a 3 c
7 4
4
b 1 e
9 9
d 5 f
Arêtes du graphe G (b,e) (a,c) (c,e) (a,e) (d,f) (a,b) (e,f) (d,e)
Poids 1 3 4 4 5 7 9 9
a 3 c
7 4
4
b 1 e
9 9
d 5 f
Arêtes du graphe G (b,e) (a,c) (c,e) (a,e) (d,f) (a,b) (e,f) (d,e)
Poids 1 3 4 4 5 7 9 9
7 4
4
b 1 e
9 9
d 5 f
a 3 c
b 1 e
d 5 f
4
4
b 1 e b 1 e
9 9
d 5 f d 5 f
Principe:
On construit un sous-graphe en ajoutant des arêtes une par une. A chaque
étape, on cherche l’arête sortante de plus petite valuation. On termine dés
que l’on a sélectionner n − 1 arêtes.
Algorithme:
F←∅
M ← {x0} (on marque un sommet quelconque de G)
tant qu’il y ’a des arêtes sortantes de M, faire
chercher l’arête sortante a = (x, y) de plus petite valuation (x ∈ M et y /∉ M)
M ← M ∪ {y}
Exemple 5:
Considérons le graphe non orienté pondéré suivant:
a 3 c
7 4
4
b 1 e
9 9
d 5 f
a 3 c
7 4
4
b 1 e
9 9
d 5 f
Etape 1: choisir n’importe quel sommet du graphe.
a 3 c
7 4
4
b 1 e
9 9
d 5 f
Etape 2: rajouter un sommet et une arête à l’arbre partiel où cette arête est de
poids minimal qui a une extrémité dans l’arbre et une hors de l’arbre.
a 3 c
7 4
4
b 1 e
9 9
d 5 f
Etape 2: rajouter un sommet et une arête à l’arbre partiel où cette arête est de
poids minimal qui a une extrémité dans l’arbre et une hors de l’arbre.
a 3 c
7 4
4
b 1 e
9 9
d 5 f
Etape 2: rajouter un sommet et une arête à l’arbre partiel où cette arête est de
poids minimal qui a une extrémité dans l’arbre et une hors de l’arbre.
a 3 c
7 4
4
b 1 e
9 9
d 5 f
Etape 2: rajouter un sommet et une arête à l’arbre partiel où cette arête est de
poids minimal qui a une extrémité dans l’arbre et une hors de l’arbre.
a 3 c
✘
7 4
4
b 1 e
9 9
d 5 f
Etape 2: rajouter un sommet et une arête à l’arbre partiel où cette arête est de
poids minimal qui a une extrémité dans l’arbre et une hors de l’arbre.
a 3 c
7 4
4
b 1 e
9 9
d 5 f
Etape 2: rajouter un sommet et une arête à l’arbre partiel où cette arête est de
poids minimal qui a une extrémité dans l’arbre et une hors de l’arbre.
a 3 c
7 4
4
b 1 e
9 9
d 5 f
Etape 2: rajouter un sommet et une arête à l’arbre partiel où cette arête est de
poids minimal qui a une extrémité dans l’arbre et une hors de l’arbre.
a 3 c
7 4
4
b 1 e
9 9
d 5 f
Etape 2: rajouter un sommet et une arête à l’arbre partiel où cette arête est de
poids minimal qui a une extrémité dans l’arbre et une hors de l’arbre.
a 3 c
7 4
4
b 1 e
9 9
d 5 f
Etape 2: rajouter un sommet et une arête à l’arbre partiel où cette arête est de
poids minimal qui a une extrémité dans l’arbre et une hors de l’arbre.
a 3 c
7 4
4
b 1 e
9 9
d 5 f
Etape 3: On s'arrête à ce niveau car on a construit un arbre couvrant contenant
n-1=5 arêtes
a 3 c
7 4
4
b 1 e
9 9
d 5 f
a 3 c
b 1 e
d 5 f
Définition:
Soit G = (S, A, v) et soient x et y deux sommets de G. On appelle distance entre
x et y et on note d(x, y), le minimum des valuations des chemins allant de x à y :
d(x, y) = min v(c(x, y)).
-5 1
Nous allons dans la suite nous intéresser à des algorithmes qui cherchent le plus
courts chemin entre un sommet donné x0 et tous les autres sommets d’un
graphe. Les résultats seront stockés de la façon suivante :
1- Le tableau λ contient le plus court chemin de x0 à chaque sommet du graphe :
λ(i) = d(x0, i).
2- Le tableau π contient les prédécesseurs de chaque sommet dans le plus court
chemin à partir de x0.
Exemple:
a 2 c
3 5 1
b e
7 5
i a c b d e
λ(i) 0 2 3 8 3
i a c b d e
π(i) null a a e c
Recherche de plus court
chemin
Principe général des algorithmes:
Les trois algorithmes que nous allons étudier fonctionnent de la façon suivante :
- On initialise les tableaux λ et π (algorithme 1).
- On calcul les λ(s) et π(s) par approximations successives, ce qui signifie, à chaque
étape on essaye d’améliorer les valeurs obtenus précédemment..
L’amélioration au niveau local se vérifie ainsi; pour un sommet x et un sommet y, on
compare la valeur λ(y) obtenue à l’étape précédente avec la valeur qu’on obtiendrait en
passant par x. c- à-d. λ(x) + v (x, y), si cette dernière est plus petite alors on remplace
λ(y) par λ(x) + v (x, y) et le père π(y) par x. (technique de relâchement, algorithme 2).
Recherche de plus court
chemin