Vous êtes sur la page 1sur 64

Chap 4 Exploration de graphes et extensions

INF 1211 Algorithmes des Graphes


Unité de Formation et Recherche Sciences et Technologie
Université de Thies

Semestre 1, Année académique 2018-2019


Ayoub Insa Correa (Université de Thies) 1 / 64 / 64
Rappel sur les structures de données Structures de données élémentaires

Convention de notation

La notion d’élément est adoptée pour désigner un type non spécifié de


données. C’est un nom générique qui peut être un entier, un ensemble
d’entiers, un fichier, un texte ou une autre structure de données.
Hypothèses : Les éléments :
1. Peuvent être comparés pour l’égalité ;
2. Sont choisis à partir d’un ensemble totalement ordonné et il est
possible dire si un élément est inférieur à un autre. On peut mettre
de côté cette relation exacte d’infériorité s’il est possible de définir
un ordre total valide ;
3. Peuvent être copiés.

Semestre 1, Année académique 2018-2019


Ayoub Insa Correa (Université de Thies) 2 / 64 / 64
Rappel sur les structures de données Structures de données élémentaires

Tableau (Array)

Un tableau est une ligne d’éléments de même type. La taille d’un


tableau est le nombre d’éléments dans le tableau et elle doit être fixée.
Cela veut dire que la quantité de mémoire allouée pour enregistrer un
tableau est connue a priori. Les tableaux sont très efficaces et très
communs en structures de données.
On accède à chacun de ses éléments en un temps constant.
L’allocation mémoire des éléments est toujours consécutive et la taille
d’un tableau ne peut être changée de façon dynamique.

Semestre 1, Année académique 2018-2019


Ayoub Insa Correa (Université de Thies) 3 / 64 / 64
Rappel sur les structures de données Structures de données élémentaires

Enregistrement (Record)

Les enregistrements sont similaires aux tableaux à la différence près


qu’on ne suppose pas que tous les éléments sont du même type.
Un enregistrement est alors une liste d’éléments de types différents.
La combinaison exacte des types est fixée et comme pour les
tableaux, la taille de l’allocation est connue d’avance. Comme pour les
tableaux, on accède à chacun de ses éléments en un temps constant.
L’allocation mémoire des éléments est toujours consécutive et la taille
d’un tableau ne peut être changée de façon dynamique.

Semestre 1, Année académique 2018-2019


Ayoub Insa Correa (Université de Thies) 4 / 64 / 64
Rappel sur les structures de données Structures de données élémentaires

Listes chainées (Linked Lists) : justification


Il existe beaucoup d’applications dans lesquelles le nombre
d’éléments change de façon dynamique. Il est possible de définir les
éléments comme des tableaux ou enregistrements en s’assurant qu’il
y aura suffisamment d’espace mémoire pour enregistrer les éléments
mais ce n’est pas efficace comme méthode.
L’insertion et la suppression d’éléments seraient très complexe car il
faudra déplacer (et allouer de l’espace mémoire à un ou plusieurs
éléments). C’est très coûteux à cause l’allocation consécutive de
l’espace mémoire aux éléments des tableaux ou enregistrements.
Pour certaines applications, nous aurons besoin d’abandonner
l’allocation consécutive de l’espace mémoire aux éléments des
tableaux pour adopter des structures de données dynamiques.
Les listes chainées constituent la forme la plus simple des structures
de données dynamiques.

Semestre 1, Année académique 2018-2019


Ayoub Insa Correa (Université de Thies) 5 / 64 / 64
Rappel sur les structures de données Structures de données élémentaires

Listes chainées (Linked Lists) : description

Chaque élément est représenté séparément et tous les éléments sont


liés grâce à l’utilisation de pointeurs.
L’insertion et la suppression d’éléments seraient très complexe car il
faudra déplacer (et allouer de l’espace mémoire à un ou plusieurs
éléments). C’est très coûteux à cause l’allocation consécutive de
l’espace mémoire aux éléments des tableaux ou enregistrements.
Pour certaines applications, nous aurons besoin d’abandonner
l’allocation consécutive de l’espace mémoire aux éléments des
tableaux pour adopter des structures de données dynamiques.

Semestre 1, Année académique 2018-2019


Ayoub Insa Correa (Université de Thies) 6 / 64 / 64
Rappel sur les structures de données Structures de données élémentaires

Listes chainées (Linked Lists) : suite


Les listes chainées constituent la forme la plus simple des structures
de données dynamiques. Une liste chainée est une liste de couples
qui consiste chacun en un élément et un pointeur tel que chaque
pointeur contient l’adresse du couple suivant. Chaque couple est
représenté par un enregistrement. Une liste chainée peut être
parcourue en suivant les adresses dans les pointeurs et ce parcours
doit être linéaire. C’est-à-dire qu’il n’est pas possible d’accéder
directement à un élément et que la liste doit être traversée dans
l’ordre. Deux défauts majeurs des listes chainées :
1. Elles requièrent plus d’espace mémoire : un pointeur
supplémentaire par élément ;
2. Si on veut accèder au 30ieme élément d’une liste chainée, il faut
commencer par le début et parcourir les 29 premiers éléments
d’abord.

Semestre 1, Année académique 2018-2019


Ayoub Insa Correa (Université de Thies) 7 / 64 / 64
Rappel sur les structures de données Structures de données élémentaires

Les arbres (Trees)


La seule structure que peuvent capturer les tableaux et les listes
chainées est l’ordre des éléments qu’ils représentent.
Or dans beaucoup d’applications, nous avons besoin de plus de
structures.
Les arbres représentent des structures hiérarchiques (rooted trees ou
arborescences). Voir dans le chapitre précédent les notions
d’arborescence, noeud racine (root node), noeuds parents (parents
nodes), noeuds enfants (children nodes), feuilles (leaf nodes), noeuds
internes (internal nodes)).
Degré d’une arborescence : le nombre maximal de noeuds enfants
pour n’importe quel noeud dans l’arbre est appelé degré d’arbre. Une
arborescence de degré 2 est appelé arbre binaire.
Hauteur d’une arborescence : Niveau maximal d’un arbre ou la
distance maximale entre une racine et une feuille.
Clé d’un noeud : numéro du noeud quand il n’y a pas de confusion
possible.)
Semestre 1, Année académique 2018-2019
Ayoub Insa Correa (Université de Thies) 8 / 64 / 64
Rappel sur les structures de données Structures de données élémentaires

Représentation d’un arbre

1. Implicite : un tableau est utilisé pour stocker tous les éléments ;


2. Explicite : Utilisation de pointeurs pour définir la connexion entre
noeud de l’arbre et un autre.

Semestre 1, Année académique 2018-2019


Ayoub Insa Correa (Université de Thies) 9 / 64 / 64
Rappel sur les structures de données Structures de données élémentaires

Les tas (Heaps)

Un tas est un arbre binaire dont les clés des noeuds satisfont la
propriété suivante :
La clé de chaque noeud est supérieure ou égale à la clé de chacun de
ses noeuds enfants.

Semestre 1, Année académique 2018-2019


Ayoub Insa Correa (Université de Thies) 10 / 64 / 64
Rappel sur les structures de données Structures de données élémentaires

Autres structures de données très importantes

I Arbres de recherche binaire


I Arbres AVL [Adel’son - Vel’skii et Landis (1962)] de recherche
binaire
I Hashage

Semestre 1, Année académique 2018-2019


Ayoub Insa Correa (Université de Thies) 11 / 64 / 64
Les algorithmes de base d’exploration de graphes Introduction

À propos des listes et matrices d’adjacence


Il y a deux façons standard de représenter un graphe G = (V , E) :
comme une collection de listes d’adjacence ou comme une matrice
d’adjacence. Chacune des deux étant applicable autant pour les
graphes orientés que pour les graphes non orientés.
La représentation par les listes d’adjacence est souvent préférée
parce qu’il fournit une manière compacte de représenter les graphes
épars (ceux pour lesquels |E| est beaucoup plus petit que |V |2 ). Elle
est moins coûteuse en mémoire.
Une représentation par une matrice d’adjacence pourrait toutefois être
préférée que le graphe est dense (|E| est proche de |V |2 ) ou quand
nous avons besoin de dire rapidement s’il existe une arête entre deux
sommets (par exemple deux parmi les plus courts chemins entre deux
sommets utilisent une représentation par les matrices d’adjacence-).
La plupart des graphes présentés en input dans toute la suite de ce
chapitre sont représentés par les listes d’adjacence.
Semestre 1, Année académique 2018-2019
Ayoub Insa Correa (Université de Thies) 12 / 64 / 64
Les algorithmes de base d’exploration de graphes Introduction

La représentation par les listes d’adjacence

La représentation par les listes d’adjacence d’un graphe G = (V , E)


consiste en un tableau Adj de |V | listes, une pour chaque sommet
dans V. Pour chaque u ∈ V , la liste d’adjacence Adj[u] contient tous
les sommets v tels qu’il existe une arête (u, v ) ∈ E, c-à-d Adj[u]
consiste en tous les sommets adjacents à u dans G. Elle pourrait
contenir de façon alternative les pointeurs à ces sommets. Les
sommets dans chaque liste d’adjacence sont typiquement stockés
dans un ordre arbitraire.
Les listes d’adjacences peuvent être directement adaptées pour
représenter les graphes valués (c-à-d les graphes pour lesquels
chaque arête possède un poids). Le poids w(u, v ) de l’arête (u, v ) ∈ E
est simplement stocké avec le sommet v dans la liste d’adjacence de
u.

Semestre 1, Année académique 2018-2019


Ayoub Insa Correa (Université de Thies) 13 / 64 / 64
Les algorithmes de base d’exploration de graphes Introduction

La représentation par les matrices d’adjacence


Un inconvénient potentiel de la représentation par les listes
d’adjacence est qu’il n’existe pas de façon rapide de déterminer si une
arête (u, v ) est présente dans un graphe que de chercher v dans la
liste d’adjacence Adj[u]. Cet inconvénient peut être remédié par une
représentation par une matrice d’adjacence du graphe avec une
utilisation asymptotiquement élevée de la mémoire.
Pour une représentation par une matrice d’adjacence du graphe
G = (V , E), nous supposerons que les sommets sont numérotés de 1
à |V | d’une façon arbitraire. La représentation en matrice d’adjacence
du graphe G consiste en matrice A = (aij ) d’ordre |V |X |V | telle que :
(
1 si(u, v ) ∈ E,
aij =
0 sinon

Semestre 1, Année académique 2018-2019


Ayoub Insa Correa (Université de Thies) 14 / 64 / 64
Les algorithmes de base d’exploration de graphes Introduction

La représentation par les matrices d’adjacence

I Leur simplicité les rend préférable surtout quand le graphe étudié


est de petite taille ;
I La quantité de mémoire utilisé est moindre quand le graphe n’est
pas valué. 1 bit par entrée plutôt qu’un mot de mémoire.

Semestre 1, Année académique 2018-2019


Ayoub Insa Correa (Université de Thies) 15 / 64 / 64
Les algorithmes de base d’exploration de graphes Introduction

Exemple de listes et matrices d’adjacence pour un


graphe non orienté

Semestre 1, Année académique 2018-2019


Ayoub Insa Correa (Université de Thies) 16 / 64 / 64
Les algorithmes de base d’exploration de graphes Introduction

Exemple de listes et matrices d’adjacence pour un


graphe orienté

Semestre 1, Année académique 2018-2019


Ayoub Insa Correa (Université de Thies) 17 / 64 / 64
Les algorithmes de base d’exploration de graphes Les Piles et Files

À propos des piles et des files

Les files et les piles sont des ensembles dynamiques dans lesquels
l’élément retiré d’un ensemble par l’opération de suppression est
pré-spécifié.
Dans une pile, l’élément supprimé de l’ensemble est celui qui a été le
plus récemment inséré : la pile implémente une politique de Last-in,
First-out ou LIFO.
De façon similaire, dans une file, l’élément supprimé est toujours celui
qui a été dans l’ensemble dynamique le plus longtemps. Une file
implémente une politique de First-in, First-out ou FIFO. Il existe
différentes façons d’implémenter des files et des piles dans un
ordinateur.

Semestre 1, Année académique 2018-2019


Ayoub Insa Correa (Université de Thies) 18 / 64 / 64
Les algorithmes de base d’exploration de graphes Les Piles et Files

Les piles

L’opération d’insertion dans une pile est souvent appelée PUSH tandis
que l’opération de suppression qui ne prend pas d’élément comme
argument est souvent appelée POP.
Une pile contenant au plus n éléments peut être implémenté avec un
tableau S[]. Le tableau possède un attribut top[S] qui indexe l’élément
le plus récemment inséré. La pile consiste en un tableau S[1..top[S]]
dans lequel S[1] l’élément du fond de la pile et top[S] se trouve à la
tête de la pile.
Quand top[S] = 0, la pile ne contient pas d’éléments. Elle est vide.

Semestre 1, Année académique 2018-2019


Ayoub Insa Correa (Université de Thies) 19 / 64 / 64
Les algorithmes de base d’exploration de graphes Les Piles et Files

Opérations sur les piles


STACK-EMPTY(S)
If top[S] = 0 then return TRUE
else return FALSE

PUSH(S,x)
top[S] := top[S] + 1
S[top[S]] := x

POP(S)
If STACK-EMPTY(s)
then error ”underflow”
else top[S] := top[S] − 1
return S[top[S] + 1]

Semestre 1, Année académique 2018-2019


Ayoub Insa Correa (Université de Thies) 20 / 64 / 64
Les algorithmes de base d’exploration de graphes Les Piles et Files

Exemple

Semestre 1, Année académique 2018-2019


Ayoub Insa Correa (Université de Thies) 21 / 64 / 64
Les algorithmes de base d’exploration de graphes Les Piles et Files

Exercice 4.1

En utilisant la figure de l’exemple précédent comme modèle, illustrer le


résultat de chaque opération de la séquence suivante : PUSH(S, 4),
PUSH(S, 1), PUSH(S, 3), POP(S), PUSH(S, 8), et POP(S) dans une
pile initialement vide S stockée dans le tableau S[1..6].

Semestre 1, Année académique 2018-2019


Ayoub Insa Correa (Université de Thies) 22 / 64 / 64
Les algorithmes de base d’exploration de graphes Les Piles et Files

Les files
L’opération d’insertion dans une file est appelée ENQUEUE tandis que
l’opération de suppression est appelée DEQUEUE (qui comme dans
l’opération sur les pile POP ne prend pas d’élément comme argument).
Sa propriété FIFO fait qu’une file agit comme une queue dans laquelle
le premier arrivé est le premier servi. Une façon d’implémenter une file
est de le faire avec un tableau contenant au plus n - 1 éléments
Q[1..n].
Une file a un attribut head qui indexe ou pointe sur la tête de file.
L’attribut tail indexe le prochain emplacement dans lequel le nouveau
élément arrivé sera inséré dans la file.
Les éléments de la file sont disposés de façon circulaire
head[Q], head[Q + 1]..tail[Q].
Quand head[Q] = tail[Q], la file est vide. Initialement, nous avons
head[Q] = tail[Q] = 1. Quand head[Q] = tail[Q] + 1, la file pleine.

Semestre 1, Année académique 2018-2019


Ayoub Insa Correa (Université de Thies) 23 / 64 / 64
Les algorithmes de base d’exploration de graphes Les Piles et Files

Opérations sur les files

ENQUEUE(Q,x)
tail|[Q] := x
If tail|[Q] = length[Q]
then tail|[Q] := 1
else tail|[Q] := tail|[Q] + 1

DEQUEUE (Q)
x := Q[head[Q]]
if head[Q] = length[Q]
then head[Q] := 1
else head[Q] := head[Q] + 1
return x

Semestre 1, Année académique 2018-2019


Ayoub Insa Correa (Université de Thies) 24 / 64 / 64
Les algorithmes de base d’exploration de graphes Les Piles et Files

Exemple

Semestre 1, Année académique 2018-2019


Ayoub Insa Correa (Université de Thies) 25 / 64 / 64
Les algorithmes de base d’exploration de graphes Les Piles et Files

Exercice 4.2

En utilisant la figure de l’exemple précédent comme modèle, illustrer le


résultat de chaque opération de la séquence suivante : ENQUEUE(Q,
4), ENQUEUE(Q, 1), ENQUEUE(Q, 3), DEQUEUE(Q), ENQUEUE(Q,
8), et DEQUEUE(Q) dans une file initialement vide Q stockée dans le
tableau S[1..6].

Semestre 1, Année académique 2018-2019


Ayoub Insa Correa (Université de Thies) 26 / 64 / 64
Les algorithmes de base d’exploration de graphes Les Piles et Files

Exercice 4.3

Re-écrire les procédures ENQUEUE et DEQUEUE afin de pouvoir


détecter les événements underflow et overflow d’une file.

Semestre 1, Année académique 2018-2019


Ayoub Insa Correa (Université de Thies) 27 / 64 / 64
Les algorithmes de base d’exploration de graphes Les Piles et Files

Listes chainées

I Simple ;
I Doublement chainée ;
I Circulaire doublement chainée.

Semestre 1, Année académique 2018-2019


Ayoub Insa Correa (Université de Thies) 28 / 64 / 64
Les algorithmes de base d’exploration de graphes Les Piles et Files

Opérations sur les éléments d’une liste chainée

I Recherche ;
I Insertion ;
I Suppression.

Semestre 1, Année académique 2018-2019


Ayoub Insa Correa (Université de Thies) 29 / 64 / 64
Les algorithmes de base d’exploration de graphes Les Piles et Files

Implémentation de pointeurs et objets

Semestre 1, Année académique 2018-2019


Ayoub Insa Correa (Université de Thies) 30 / 64 / 64
Les algorithmes de base d’exploration de graphes Les Piles et Files

L’algorithme de recherche en largeur (Introduction)

En anglais Breadth-first-search ou BFS, il est l’un des algorithmes


d’exploration les plus simples et sert de modèle à beaucoup d’autres
algorithmes.
Il marche aussi bien pour les graphes orientés que les graphes non
orientés.
Soit un graphe G = (V , E) et un sommet particulier s, l’algorithme BFS
fouille systématiquement les arêtes de G pour découvrir chaque
sommet atteignable à partir de s.
BFS tire son nom du fait qu’il étend la frontière entre les sommets
découverts et les sommets non découverts dans la largeur de la
frontière c’est-à-dire l’algorithme découvre tous les sommets situés à
la distance k de s avant de découvrir tout autre sommet situé à la
distance k + 1.

Semestre 1, Année académique 2018-2019


Ayoub Insa Correa (Université de Thies) 31 / 64 / 64
Les algorithmes de base d’exploration de graphes Les Piles et Files

L’algorithme de recherche en largeur BFS


(Description)

Pour garder la trace de la progression de l’algorithme, BFS colorie


chaque sommet en blanc, gris ou noir.
Au début, tous les sommets sont blancs et peuvent par la suite devenir
gris ou noirs. Un sommet est découvert la première fois qu’il est
rencontré pendant l’exploration du graphe et à ce moment il change de
couleur. Les sommets gris et noirs ont déjà été découverts mais BFS
les distingue pour s’assurer que l’exploration se poursuit en largeur.
Si (u, v ) ∈ E et le sommet u est noir, alors le sommet v est soit gris
soit noir ; C’est-à-dire que tous les sommets adjacents à des sommets
noirs ont été découverts. Les sommets gris peuvent avoir des
sommets adjacents blancs. Ils représentent la frontière entre les
sommets découverts et les sommets pas encore découverts.

Semestre 1, Année académique 2018-2019


Ayoub Insa Correa (Université de Thies) 32 / 64 / 64
Les algorithmes de base d’exploration de graphes L’algorithme de recherche en largeur Breadth-First-Search -BFS-

Hypothèses et précisions

Le graphe G = (V , E) fourni en input est représenté grâce à des listes


d’adjacence.
Plusieurs autres structures de données liées à chaque sommet sont
utilisées.
Ainsi la couleur de chaque sommet u ∈ V est stocké dans la variable
color [u] et le prédécesseur de u est stocké dans la variable π(u).
Si u n’a pas de prédécesseur (par exemple u = s ou u n’a pas été
découvert), alors π(u) = NIL.
La distance entre la source s et le sommet u par l’algorithme est
stocké dans d[u].
L’algorithme BFS utilise une file FIFO pour gérer l’ensemble des
sommets gris.

Semestre 1, Année académique 2018-2019


Ayoub Insa Correa (Université de Thies) 33 / 64 / 64
Les algorithmes de base d’exploration de graphes L’algorithme de recherche en largeur Breadth-First-Search -BFS-

BFS(G,s) For each u ∈ V − s


do color [u] := BLANC
d[u] := ∞
π(u) := NIL
color [s] := GRIS
d[s] := 0
π(s) := NIL
Q := ∅
ENQUEUE(Q, s)
While Q 6= ∅
do u := DEQUEUE(Q)
For each v ∈ Adj[u]
do if color [v ] := BLANC
then color [v ] := GRIS
d[v ] := d[u] + 1
π(v ) := u
ENQUEUE(Q,v)
color [u] := NOIR
Semestre 1, Année académique 2018-2019
Ayoub Insa Correa (Université de Thies) 34 / 64 / 64
Les algorithmes de base d’exploration de graphes L’algorithme de recherche en largeur Breadth-First-Search -BFS-

Exemple d’application de l’algo BFS (partie 1)

Semestre 1, Année académique 2018-2019


Ayoub Insa Correa (Université de Thies) 35 / 64 / 64
Les algorithmes de base d’exploration de graphes L’algorithme de recherche en largeur Breadth-First-Search -BFS-

Exemple d’application de l’algo BFS (partie 2)

Semestre 1, Année académique 2018-2019


Ayoub Insa Correa (Université de Thies) 36 / 64 / 64
Les algorithmes de base d’exploration de graphes L’algorithme de recherche en largeur Breadth-First-Search -BFS-

Exemple d’application de l’algorithme d’exploration


BFS
Soit le graphe orienté G = (V , E) représenté par le dessin ci-dessous.
On suppose que les listes de successeurs sont données dans l’ordre
des numéros croissants.

V1 V3 V5 V7

V4 V6
V2

Semestre 1, Année académique 2018-2019


Ayoub Insa Correa (Université de Thies) 37 / 64 / 64
Les algorithmes de base d’exploration de graphes L’algorithme de recherche en largeur Breadth-First-Search -BFS-

Exemple d’application de l’algorithme de recherche en


largeur BFS
Avec l’algorithme de recherche en largeur BFS, nous obtenons l’ordre
d’exploration suivant :

1 3 5 7

2 4 6

Semestre 1, Année académique 2018-2019


Ayoub Insa Correa (Université de Thies) 38 / 64 / 64
L’algorithme de recherche en profondeur Depth-First-Search
Les algorithmes de base d’exploration de graphes -DFS-

Description du DFS

Comme son nom l’indique, L’algorithme DFS cherche le plus


profondément autant que possible dans le graphe. Dans le DFS, les
aretes sont explorées à partir du plus récent sommet découvert qui
possède encore des arêtes le quittant. Quand toutes les arêtes de v
ont été explorées, la recherche remonte pour explorer les arêtes
quittant le sommet à partir duquel v a été découvert. Ce processus
continue jusqu’à ce que tous les sommets atteignables à partir du
sommet source soient découverts.
S’il reste un (ou des sommets) pas encore découvert(s), il est
sélectionné et l’exploration est répétée jusqu’à ce que tous les
sommets soient découverts.

Semestre 1, Année académique 2018-2019


Ayoub Insa Correa (Université de Thies) 39 / 64 / 64
L’algorithme de recherche en profondeur Depth-First-Search
Les algorithmes de base d’exploration de graphes -DFS-

Comparaison de DFS avec BFS

À l’opposé du BFS dont le graphe des prédécesseurs est un arbre, le


sous graphe des prédécesseurs produit par l’algorithme DFS peut être
une forêt (plusieurs arbres) parce que l’exploration peut être répétée à
partir de plusieurs sources.
Ainsi le sous graphe des prédécesseurs produit par l’algorithme DFS
est défini d’une façon légèrement différente de celui du BFS :
Soit Gπ = (V , Eπ ) avec
Eπ = {(π(v ), v ) : v ∈ V et π(v ) 6= NIL}
Le sous graphe des prédécesseurs du DFS forme une forêt composée
de plusieurs arbres et les arêtes dans Eπ sont appelées arêtes d’arbre
(tree edges).

Semestre 1, Année académique 2018-2019


Ayoub Insa Correa (Université de Thies) 40 / 64 / 64
L’algorithme de recherche en profondeur Depth-First-Search
Les algorithmes de base d’exploration de graphes -DFS-

Comparaison de DFS avec BFS (Suite 1)


Comme avec le BFS, les sommets sont coloriés pendant l’exploration
pour indiquer leurs états. Chaque sommet est initialement blanc puis
devient gris quand il est découvert pendant l’exploration avant d’être
noirci quand il est fini (c’est-à - dire que sa liste d’adjacence a été
complétement examinée).
Cette technique garantit que chaque sommet finira dans exactement
un seul arbre car les arbres du DFS sont tous disjoints.
Outre la création d’une forêt, la DFS met deux étiquettes temps sur
chaque sommet v. La première étiquette d[v ] enregistre le moment où
v est découvert pour la première fois (et colorié en gris) tandis que la
seconde étiquette enregistre le moment où l’exploration finit de scruter
la liste d’adjacence de v (et noircit v).
Ces étiquettes temps sont des nombres entiers compris entre 1 et |V |
puisqu’elles sont créées pour chacun des |V | sommets. Elles sont
utilisées dans beaucoup d’algorithmes de graphes et sont souvent
utiles dans le raisonnement sur le comportement du DFS.
Semestre 1, Année académique 2018-2019
Ayoub Insa Correa (Université de Thies) 41 / 64 / 64
L’algorithme de recherche en profondeur Depth-First-Search
Les algorithmes de base d’exploration de graphes -DFS-

Comparaison de DFS avec BFS (Suite 2)

Pour chaque sommet u, d[u] < f [u].


Le sommet est BLANC avant le temps d[u], GRIS entre d[u] et f [u] et
NOIR après f [u].

Semestre 1, Année académique 2018-2019


Ayoub Insa Correa (Université de Thies) 42 / 64 / 64
L’algorithme de recherche en profondeur Depth-First-Search
Les algorithmes de base d’exploration de graphes -DFS-

L’algorithme de base du DFS


DFS(G)
for each u ∈ V
do color [u] := BLANC
π(u) := NIL
time := 0
for each u ∈ V
do if color [u] := BLANC
then DFS-VISIT(u)
DFS-VISIT(u)
color [u] := GRIS
time := time + 1
d[u] := time
for each v ∈ Adj[u]
do if color [v ] := BLANC
then π(v ) := u
DFS-VISIT(v) Semestre 1, Année académique 2018-2019
Ayoub Insa Correa (Université de Thies) 43 / 64 / 64
L’algorithme de recherche en profondeur Depth-First-Search
Les algorithmes de base d’exploration de graphes -DFS-

L’algorithme de base du DFS (Suite)

color [u] := NOIR


time := time + 1
f [u] := time

Semestre 1, Année académique 2018-2019


Ayoub Insa Correa (Université de Thies) 44 / 64 / 64
L’algorithme de recherche en profondeur Depth-First-Search
Les algorithmes de base d’exploration de graphes -DFS-

Exemple d’application de l’algo DFS (partie 1)

Semestre 1, Année académique 2018-2019


Ayoub Insa Correa (Université de Thies) 45 / 64 / 64
L’algorithme de recherche en profondeur Depth-First-Search
Les algorithmes de base d’exploration de graphes -DFS-

Exemple d’application de l’algo DFS (partie 2)

Semestre 1, Année académique 2018-2019


Ayoub Insa Correa (Université de Thies) 46 / 64 / 64
L’algorithme de recherche en profondeur Depth-First-Search
Les algorithmes de base d’exploration de graphes -DFS-

La classification des arêtes


Quatre types suivants d’arêtes sont définis par rapport à la forêt Gπ
produite par le DFS :
1. Les arêtes d’arbre (tree edges) sont des arêtes dans la forêt Gπ
produite par le DFS. L’arête (u, v ) est une arête d’arbre si elle a
été découverte en premier en explorant l’arête (u, v ) ;
2. Les arêtes arrière (back edges)sont les arêtes (u, v ) reliant un
sommet u à un ancêtre v dans un arbre DFS. Les boucles, qui
peuvent exister dans les graphes orientés sont considérés comme
des arêtes arrière ;
3. Les arêtes avant (forward edges) sont les arêtes (u, v ) qui
n’appartiennent pas à un arbre DFS et qui relient un sommet u à
un descendant v dans un arbre DFS ;
4. Les arêtes croisées (cross edges) sont toutes les autres arêtes.
Elles peuvent relier soit des sommets d’un même arbre DFS
(aussi longtemps qu’un sommet n’est pas ancêtre de l’autre), soit
des sommets situés dans des arbres DFS différents.
Semestre 1, Année académique 2018-2019
Ayoub Insa Correa (Université de Thies) 47 / 64 / 64
L’algorithme de recherche en profondeur Depth-First-Search
Les algorithmes de base d’exploration de graphes -DFS-

Conséquence de cette classification (ou Lemme)

Un graphe orienté est acyclique si et seulement si son exploration par


l’algorithme DFS ne produit pas d’arête arrière (back edge).

Semestre 1, Année académique 2018-2019


Ayoub Insa Correa (Université de Thies) 48 / 64 / 64
L’algorithme de recherche en profondeur Depth-First-Search
Les algorithmes de base d’exploration de graphes -DFS-

Exemple de classification d’arêtes par le DFS

Le résultat du DFS sur le graphe ci-dessous. Les étiquettes temps


sont indiquées dans les sommets.

Semestre 1, Année académique 2018-2019


Ayoub Insa Correa (Université de Thies) 49 / 64 / 64
L’algorithme de recherche en profondeur Depth-First-Search
Les algorithmes de base d’exploration de graphes -DFS-

Exemple de classification d’arêtes par le DFS (Suite)

Le graphe précédent avec toutes les arêtes d’arbre et arêtes avant qui
descendent à l’intérieur d’un arbre DFS et toutes les arêtes arrière qui
remontent d’un descendant à un ancêtre.

Semestre 1, Année académique 2018-2019


Ayoub Insa Correa (Université de Thies) 50 / 64 / 64
L’algorithme de recherche en profondeur Depth-First-Search
Les algorithmes de base d’exploration de graphes -DFS-

Remarques

Il pourrait sembler arbitraire que l’algorithme :


I BFS soit déroulé à partir d’une seule source ;
I DFS est déroulé à partir de plusieurs sources possibles
Cette démarche tout simplement orientée vers les applications de ces
deux algorithmes car, conceptuellement, il est possible de dérouler
BFS à partir de plusieurs sources et DFS à partir d’une seule source.
BFS est souvent utilisé pour trouver les plus courts chemins (avec les
sous graphes de prédécesseurs associés) à partir d’une seule source
tandis que DFS est usuellement une partie d’un algorithme plus grand.

Semestre 1, Année académique 2018-2019


Ayoub Insa Correa (Université de Thies) 51 / 64 / 64
L’algorithme de recherche en profondeur Depth-First-Search
Les algorithmes de base d’exploration de graphes -DFS-

Le tri topologique

Cette partie porte sur une application de l’algo DFS aux graphes
orientés acycliques Un tri topologique sur un graphe orienté acyclique
G = (V , E) est un rangement linéaire de tous ses sommets de telle
sorte que si G contient un arc (u, v ) alors u apparait avant v dans le
rangement. Si le graphe n’est pas acyclique, alors aucun rangement
linéaire n’est possible. Un tri topologique d’un graphe peut être vu
comme un rangement de ses sommets le long d’une droite horizontale
de telle sorte que les arcs vont de la gauche vers la droite.

Semestre 1, Année académique 2018-2019


Ayoub Insa Correa (Université de Thies) 52 / 64 / 64
L’algorithme de recherche en profondeur Depth-First-Search
Les algorithmes de base d’exploration de graphes -DFS-

Remarques sur l’algo DFS

Les graphes orientés acycliques sont souvent utilisés dans des


applications pour indiquer les priorités (ou précédences) entre des
événements.

Semestre 1, Année académique 2018-2019


Ayoub Insa Correa (Université de Thies) 53 / 64 / 64
L’algorithme de recherche en profondeur Depth-First-Search
Les algorithmes de base d’exploration de graphes -DFS-

L’algorithme de tri topologique

Appeler DFS(G) pour calculer les temps de complétion f [v ] de chaque


sommet v.
À chaque fois qu’un sommet est complété, l’insérer au devant d’une
liste chainée
Return la liste chainée des sommets.

Semestre 1, Année académique 2018-2019


Ayoub Insa Correa (Université de Thies) 54 / 64 / 64
L’algorithme de recherche en profondeur Depth-First-Search
Les algorithmes de base d’exploration de graphes -DFS-

la recherche des composantes fortement connexes


d’un graphe orienté
Rappel :
Une composante fortement connexe d’un graphe orienté G = (V , E)
est un ensemble maximal C de V tel que que pour chaque paire de
sommets u et v dans C, il existe un chemin de u vers v et un chemin
de v vers u c’est-à-dire que u et v sont atteignables mutuellement à
partir de l’un vers l’autre.
Exemple :

Semestre 1, Année académique 2018-2019


Ayoub Insa Correa (Université de Thies) 55 / 64 / 64
L’algorithme de recherche en profondeur Depth-First-Search
Les algorithmes de base d’exploration de graphes -DFS-

la recherche des composantes fortement connexes


d’un graphe orienté (Suite 1)
Définition :
L’algorithme de DFS utilisé pour trouver les composantes fortement
connexes d’un graphe orienté G = (V , E) utilise la notion de
transposée d’un graphe qui est définie par GT = (V , E T ) avec
E T = (u, v ) : (v , u) ∈ E.
En fait E T consiste en l’ensemble des arcs de G avec leur orientation
inversée.

Semestre 1, Année académique 2018-2019


Ayoub Insa Correa (Université de Thies) 56 / 64 / 64
L’algorithme de recherche en profondeur Depth-First-Search
Les algorithmes de base d’exploration de graphes -DFS-

Algorithme de recherche de composantes fortement


connexes d’un graphe orienté

COMP-FORTEMENT-CONNEXES(G) Ligne 1 : Appeler DFS(G) pour


calculer les temps de complétion f [u] pour chaque sommet.
Ligne 2 : Calculer GT .
Ligne 3 : Appeler DFS(GT ), mais dans la boucle principale de DFS
considérer les sommets dans l’ordre décroissant des f [u] comme
calculé en Ligne 1.
ligne 4 : Retourner les sommets de chaque arbre de la forêt formée
dans Ligne 3 comme une composante fortement connexe séparée.

Semestre 1, Année académique 2018-2019


Ayoub Insa Correa (Université de Thies) 57 / 64 / 64
L’algorithme de recherche en profondeur Depth-First-Search
Les algorithmes de base d’exploration de graphes -DFS-

Exemple d’application de l’algo de recherche de


composantes fortement connexes d’un graphe orienté

Le graphe acyclique des composantes obtenu en contractant tous les


arcs de chaque composante connexe en un seul sommet.
Remarques :
La forêt calculée dans la Ligne 3 de l’algo
COMP-FORTEMENT-CONNEXES(G) est montrée dans l’exemple
précédent avec les arcs d’arbre ombragés. Chaque composante
fortement connexe correspond à un arbre du DFS. Les sommets b, c,
g et h, qui sont fortement ombragés sont les racines des arbres
Semestre 1, Année académique 2018-2019
produits
Ayoub par
Insa Correa le DFS
(Université (GT ).
de Thies) 58 / 64 / 64
L’algorithme de recherche en profondeur Depth-First-Search
Les algorithmes de base d’exploration de graphes -DFS-

Algorithme de recherche d’un chemin de s à t

Donnée : G = (V , E) avec ses listes de successeurs ; sommets


particuliers s, t.
Résultat : chemin de s à t.

Semestre 1, Année académique 2018-2019


Ayoub Insa Correa (Université de Thies) 59 / 64 / 64
L’algorithme de recherche en profondeur Depth-First-Search
Les algorithmes de base d’exploration de graphes -DFS-

début
m(s) = 0
Q=s
Tant que Q 6= ∅ et m(t) non défini faire
debut
Soit v un élément de Q
retirer v de Q
pour tout v 0 ∈ S(v ) alors
debut
si m(v 0 ) indéfini alors m(v 0 ) = v
si v 0 = t alors CHEMIN(v 0 )
sinon introduire v 0 dans Q
fin
fin
écrire "pas de chemin de s à t dans G"
Fin tant que
fin
Semestre 1, Année académique 2018-2019
Ayoub Insa Correa (Université de Thies) 60 / 64 / 64
L’algorithme de recherche en profondeur Depth-First-Search
Les algorithmes de base d’exploration de graphes -DFS-

Procédure CHEMIN(v)

Cette procédure donne une suite de sommets formant un chemin de s


à v.
Si m(v ) = 0 alors retour(v)
Sinon CHEMIN (m(v )) ⊕(v )
⊕ désigne la concaténation de deux suites de sommets.

Semestre 1, Année académique 2018-2019


Ayoub Insa Correa (Université de Thies) 61 / 64 / 64
L’algorithme de recherche en profondeur Depth-First-Search
Les algorithmes de base d’exploration de graphes -DFS-

Exercice 1 (TD)

Formuler le problème de la recherche d’un cheminement de s à t en


termes de graphes ; Donner le graphe associé. Comment le construire
en général ?
Appliquer l’algorithme d’exploration
1. en profondeur
2. en largeur
au dessin ci-contre. Donner chaque fois l’ordre de visite des sommets
et les arcs utilisés pour introduire les sommets dans Q.

Semestre 1, Année académique 2018-2019


Ayoub Insa Correa (Université de Thies) 62 / 64 / 64
L’algorithme de recherche en profondeur Depth-First-Search
Les algorithmes de base d’exploration de graphes -DFS-

Suite Exercice 1 (TD)

Semestre 1, Année académique 2018-2019


Ayoub Insa Correa (Université de Thies) 63 / 64 / 64
L’algorithme de recherche en profondeur Depth-First-Search
Les algorithmes de base d’exploration de graphes -DFS-

Exercice 2 (TD)

Donner les ordres d’exploration par les algorithmes DFS et BFS


appliqués au graphe ci-dessous (à partir de 1)

Y a-t-il des graphes (non triviaux, avec un sommet de départ et une


numérotation des sommets définis) où les ordres d’introduction des
sommets dans la liste Q des deux méthodes sont les mêmes ?

Semestre 1, Année académique 2018-2019


Ayoub Insa Correa (Université de Thies) 64 / 64 / 64

Vous aimerez peut-être aussi