Vous êtes sur la page 1sur 84

Chap 3 Algorithmes de base pour les Sciences des Données

INF 4112 Algorithmes des Graphes


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

Semestre 1, Année académique 2023


Ayoub Insa Correa (Université de Thies) 1 / 84
Compléments du chapitre 2 sur les plus courts chemins

Compléments du chapitre 2 sur les plus courts


chemins

Semestre 1, Année académique 2023


Ayoub Insa Correa (Université de Thies) 2 / 84
Compléments du chapitre 2 sur les plus courts chemins

Algorithme de Bellman-Ford

Motivation : Les algorithmes de plus courts chemins à une seule


destination comme celui de Dijkstra supposent que les poids des
arêtes dans le graphe fourni en input soient tous positifs. Si des arêtes
de poids négatifs sont permises dans le graphe fourni en input,
l’algorithme de Dijkstra ne peut plus être utilisé.
Dans ce cas, d’autres algorithmes comme celui de Bellman-Ford,
peuvent être utilisés et produisent une réponse correcte pour autant
qu’il n’existe pas de cycles de poids négatif atteignables depuis la
source. S’il existe un cycle de poids négatif, l’algorithme de
Bellman-Ford peut le détecter et l’afficher.
L’algorithme de Bellman-Ford est toutefois plus lent que l’algorithme de
Dijkstra.

Semestre 1, Année académique 2023


Ayoub Insa Correa (Université de Thies) 3 / 84
Compléments du chapitre 2 sur les plus courts chemins

Description sommaire de l’algorithme de Bellman-Ford

L’algorithme de Bellman-Ford résoud le problème du plus court chemin


à source unique dans le cas général (les poids des arêtes peuvent être
négatifs ou non).
Soit un graphe orienté G = (V , E) de source s et une fonction poids
W : E → R.
L’algorithme de Bellman-Ford retourne une valeur booléenne indiquant
s’il y a ou non un cycle de poids négatif atteignable à partir de la
source.
S’il y a un tel cycle, l’algorithme indique qu’il n’y a pas solution.
S’il n’existe pas un tel cycle, l’algorithme produit des plus courts
chemins ainsi que leurs poids.

Semestre 1, Année académique 2023


Ayoub Insa Correa (Université de Thies) 4 / 84
Compléments du chapitre 2 sur les plus courts chemins

La procédure d’initialisation INIT

V est l’ensemble des sommets du graphe G.

INIT(G, s)
for chaque sommet v ∈ V
do d[v ] ← ∞
π[v ] ← NIL
d[s] = 0

Par définition, d[v ] est le candidat plus court chemin de s à v.


Le symbole ← signifie tout simplement = (on affecte la valeur du côté
droit au côté gauche).

Semestre 1, Année académique 2023


Ayoub Insa Correa (Université de Thies) 5 / 84
Compléments du chapitre 2 sur les plus courts chemins

La procédure de relaxation RELAX

La procédure ci-dessous exécute une étape de relaxation sur l’arête


(u, v ).

RELAX(u, v, W)
If d[v ] > d[u] + w(u, v )
then d[v ] ← d[u] + w(u, v )
π[v ] ← u

Semestre 1, Année académique 2023


Ayoub Insa Correa (Université de Thies) 6 / 84
Compléments du chapitre 2 sur les plus courts chemins

L’algorithme de Bellman-Ford

Le poids véritable du plus court chemin de s à v est δ(s, v ).


E est l’ensemble des arêtes du graphe G.

BELLMAN-FORD(G, W, s)
INIT(G, s)
for i ← 1 à |V | − 1
do for pour chaque arête (u, v ) ∈ E
do RELAX(u, v, W)
for chaque arête (u, v ) ∈ E
do if d[v ] > d[u] + W(u, v )
then return FALSE
return TRUE

Semestre 1, Année académique 2023


Ayoub Insa Correa (Université de Thies) 7 / 84
Compléments du chapitre 2 sur les plus courts chemins

Exercice

Appliquer l’algorithme de Bellman-Ford au graphe suivant :

Semestre 1, Année académique 2023


Ayoub Insa Correa (Université de Thies) 8 / 84
Compléments du chapitre 2 sur les plus courts chemins Plus courts chemins entre toutes les paires de sommets

Plus courts chemins entre toutes les paires de


sommets
Motivation :
Il s’agit de trouver un plus court chemin de u à v pour chaque paire de
sommets u et v.
Ce problème peut être résolu en faisant tourner un algorithme de plus
court chemin à source unique pour chaque sommet (|V| fois, à chaque
fois un sommet considéré comme étant la source). Si les poids de tous
les arcs sont positifs, on peut utiliser l’algorithme de Dijkstra.
Toutefois, un algorithme dédié de recherche de la longueur des plus
courts chemins entre toutes les paires de sommets est plus rapide.
En outre, sa structure est d’un intérêt particulier. Il peut, par exemple,
être utilisé typiquement pour déterminer la charge de trafic routier
attendue dans différents segments d’un réseau de transport. En effet,
ce problème peut survenir dans la conception d’un tableau de
distances entre toutes les paires de villes pour un atlas routier.
Semestre 1, Année académique 2023
Ayoub Insa Correa (Université de Thies) 9 / 84
Compléments du chapitre 2 sur les plus courts chemins Plus courts chemins entre toutes les paires de sommets

Plus courts chemins entre toutes les paires de


sommets (Suite 1)

Par convenance, nous supposons que les sommets du graphe G sont


numérotés de 1, 2, ... à |V|, de telle sorte nous avons en input la
matrice W n × n représentant les poids des arêtes d’un graphe orienté
G = (V , E) avec n sommets c-à-d W = (wij ), où

0
 si i = j,

wij = le poids de l arc (i, j) si i ̸= j et (i, j) ∈ E

∞ si i ̸= j et (i, j) ∈
/ E

Semestre 1, Année académique 2023


Ayoub Insa Correa (Université de Thies) 10 / 84
Compléments du chapitre 2 sur les plus courts chemins Plus courts chemins entre toutes les paires de sommets

Plus courts chemins entre toutes les paires de


sommets (Suite 2)

L’algorithme de FLOYD-WARSHALL est tout à fait pratique pour les


graphes de taille modérée.
FLOYD-WARSHALL(W)
n = rows[W]
D=W
for k = 1 to n
do for i = 1 to n
do for j = 1 to n
do dij = min(dij , dik + dkj )
return D
La procédure retourne ainsi la matrice D des poids des plus courts
chemins.

Semestre 1, Année académique 2023


Ayoub Insa Correa (Université de Thies) 11 / 84
Rappel sur les structures de données

Introduction

Jusqu’ici, les algorithmes abordés tournaient en grande partie autour


de relations d’ordre.
Dans ce chapitre, nous aborderons des algorithmes utiles pour
modéliser des relations plus complexes entre des objets c’est-à-dire
l’algorithme des plus courts chemins entre toutes les paires de
sommets, les techniques d’exploration de graphes et le tri topologique.
Les algorithmes liés aux composantes fortement connexes (Strongly
Connected Components), aux composantes faiblement connexes
(Union Find), aux couplages et flots sur les réseaux seront aussi
abordés.

Semestre 1, Année académique 2023


Ayoub Insa Correa (Université de Thies) 12 / 84
Rappel sur les structures de données

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 2023
Ayoub Insa Correa (Université de Thies) 13 / 84
Rappel sur les structures de données

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
un noeud de l’arbre et un autre.

Semestre 1, Année académique 2023


Ayoub Insa Correa (Université de Thies) 14 / 84
Rappel sur les structures de données

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 2023


Ayoub Insa Correa (Université de Thies) 15 / 84
Rappel sur les structures de données

Autres structures de données très importantes

▶ Arbres de recherche binaires


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

Semestre 1, Année académique 2023


Ayoub Insa Correa (Université de Thies) 16 / 84
Les algorithmes de base d’exploration de graphes Propriétés des plus courts chemins

Propriétés des plus courts chemins

Semestre 1, Année académique 2023


Ayoub Insa Correa (Université de Thies) 17 / 84
Les algorithmes de base d’exploration de graphes Propriétés des plus courts chemins

Inégalité triangulaire

Pour chaque arête (u, v ) ∈ E, nous avons δ(s, v ) ≤ δ(s, u) + W(u, v ).

Semestre 1, Année académique 2023


Ayoub Insa Correa (Université de Thies) 18 / 84
Les algorithmes de base d’exploration de graphes Propriétés des plus courts chemins

Borne supérieure

Nous avons toujours d[v ] ≥ δ(s, v ) ∀ v ∈ V et dès que d[v ] atteint la


valeur δ(s, v ), elle ne changera plus jamais.

Semestre 1, Année académique 2023


Ayoub Insa Correa (Université de Thies) 19 / 84
Les algorithmes de base d’exploration de graphes Propriétés des plus courts chemins

Pas de chemin

S’il n’y a pas de chemin de s à v, alors nous aurons toujours


d[v ] = δ(s, v ) = ∞.

Semestre 1, Année académique 2023


Ayoub Insa Correa (Université de Thies) 20 / 84
Les algorithmes de base d’exploration de graphes Propriétés des plus courts chemins

Convergence

Si s ⇝ u → v est un plus court chemin dans G pour u, v ∈ V et si


d[u] = δ(s, u) à un moment précédant la relaxation de l’arête (u, v ),
alors d[v ] = δ(s, v ) tout le temps après.

Semestre 1, Année académique 2023


Ayoub Insa Correa (Université de Thies) 21 / 84
Les algorithmes de base d’exploration de graphes Propriétés des plus courts chemins

Relaxation de chemin

Si p = {v0 , v1 , ..., vk } est un plus court chemin de s = v0 à vk et les


arêtes de p sont relaxées dans l’ordre (v0 , v1 ), (v1 , v2 ), ..., (vk −1 , vk )
alors d[vk ] = δ(s, vk ). Cette propriété reste valide quelle que soit toute
autre étape de relaxation ultérieure qui pourrait avoir lieu, même si
cette relaxation est combinée avec les relaxations des arêtes de p.

Semestre 1, Année académique 2023


Ayoub Insa Correa (Université de Thies) 22 / 84
Les algorithmes de base d’exploration de graphes Propriétés des plus courts chemins

Sous-graphe de prédécesseurs

Dès que d[v ] = δ(s, v ) ∀v ∈ V , le sous-graphe des prédécesseurs


est un arbre de plus courts chemins de racine s.

Semestre 1, Année académique 2023


Ayoub Insa Correa (Université de Thies) 23 / 84
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 2023


Ayoub Insa Correa (Université de Thies) 24 / 84
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 2023


Ayoub Insa Correa (Université de Thies) 25 / 84
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 2023
Ayoub Insa Correa (Université de Thies) 26 / 84
Les algorithmes de base d’exploration de graphes Les Piles et Files

Exemple

Semestre 1, Année académique 2023


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

Exercice 3.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 2023


Ayoub Insa Correa (Université de Thies) 28 / 84
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 2023


Ayoub Insa Correa (Université de Thies) 29 / 84
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 2023


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

Exemple

Semestre 1, Année académique 2023


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

Exercice 3.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 2023


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

Exercice 3.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 2023


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

Listes chainées

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

Semestre 1, Année académique 2023


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

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

▶ Recherche ;
▶ Insertion ;
▶ Suppression.

Semestre 1, Année académique 2023


Ayoub Insa Correa (Université de Thies) 35 / 84
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 2023


Ayoub Insa Correa (Université de Thies) 36 / 84
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 2023


Ayoub Insa Correa (Université de Thies) 37 / 84
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 calculée par l’algorithme
est stockée dans d[u].
L’algorithme BFS utilise une file FIFO pour gérer l’ensemble des
sommets gris.

Semestre 1, Année académique 2023


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

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 ̸= ∅
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 2023
Ayoub Insa Correa (Université de Thies) 39 / 84
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 2023


Ayoub Insa Correa (Université de Thies) 40 / 84
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 2023


Ayoub Insa Correa (Université de Thies) 41 / 84
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 2023


Ayoub Insa Correa (Université de Thies) 42 / 84
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 2023


Ayoub Insa Correa (Université de Thies) 43 / 84
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 2023


Ayoub Insa Correa (Université de Thies) 44 / 84
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 ) ̸= 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 2023


Ayoub Insa Correa (Université de Thies) 45 / 84
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.

Semestre 1, Année académique 2023


Ayoub Insa Correa (Université de Thies) 46 / 84
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)

Outre la création d’une forêt, la DFS met deux étiquettes temps (time
stamps) 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 f [u] 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.
Pour chaque sommet u, d[u] < f [u].
Un 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 2023


Ayoub Insa Correa (Université de Thies) 47 / 84
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)

Semestre 1, Année académique 2023


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

L’algorithme de base de recherche en profondeur DFS


(Suite)

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)
color [u] := NOIR
time := time + 1
f [u] := time

Semestre 1, Année académique 2023


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

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

Semestre 1, Année académique 2023


Ayoub Insa Correa (Université de Thies) 50 / 84
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 2023


Ayoub Insa Correa (Université de Thies) 51 / 84
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 de recherche en
profondeur. 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 2023
Ayoub Insa Correa (Université de Thies) 52 / 84
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


Voici un graphe 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.

La lettre F sur une arête indique c’est une arête avant (forward edge).
La lettre B sur une arête indique c’est une arête arrière (back edge).
La lettre C sur une arête indique c’est une arête croisée (cross edge).
Semestre 1, Année académique 2023
Ayoub Insa Correa (Université de Thies) 53 / 84
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 2023


Ayoub Insa Correa (Université de Thies) 54 / 84
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 2023


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

Exercice 3.4 : Caractérisation des arêtes par


l’algorithme DFS

Montrer qu’une arête (u, v ) est :


1. Une arête d’arbre ou une arête avant si et seulement si d[u] < d[v]
< f[v] < f[u],
2. Une arête arrière si et seulement si d[v] < d[u] < f[u] < f[v], et
3. Une arête croisée si et seulement si d[v] < f[v] < d[u] < f[u].

Semestre 1, Année académique 2023


Ayoub Insa Correa (Université de Thies) 56 / 84
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 :


▶ BFS soit déroulé à partir d’une seule source ;
▶ DFS soit 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 2023


Ayoub Insa Correa (Université de Thies) 57 / 84
Les algorithmes de base d’exploration de graphes Applications de l’algo de 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 2023


Ayoub Insa Correa (Université de Thies) 58 / 84
Les algorithmes de base d’exploration de graphes Applications de l’algo de 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 2023


Ayoub Insa Correa (Université de Thies) 59 / 84
Les algorithmes de base d’exploration de graphes Applications de l’algo de 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 2023


Ayoub Insa Correa (Université de Thies) 60 / 84
Les algorithmes de base d’exploration de graphes Applications de l’algo de 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 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 2023


Ayoub Insa Correa (Université de Thies) 61 / 84
Les algorithmes de base d’exploration de graphes Applications de l’algo de 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 2023


Ayoub Insa Correa (Université de Thies) 62 / 84
Les algorithmes de base d’exploration de graphes Applications de l’algo de DFS

Algorithme de recherche de composantes fortement


connexes d’un graphe orienté

COMP-FORTEMENT-CONNEXES(G)
Étape 1 : Appeler DFS(G) pour calculer les temps de complétion f [u]
pour chaque sommet.
Étape 2 : Calculer GT .
Étape 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.
Étape 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 2023


Ayoub Insa Correa (Université de Thies) 63 / 84
Les algorithmes de base d’exploration de graphes Applications de l’algo de 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.

Semestre 1, Année académique 2023


Ayoub Insa Correa (Université de Thies) 64 / 84
Les algorithmes de base d’exploration de graphes Applications de l’algo de DFS

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
produits par le DFS (GT ).

Semestre 1, Année académique 2023


Ayoub Insa Correa (Université de Thies) 65 / 84
Les algorithmes de base d’exploration de graphes Applications de l’algo de 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 2023


Ayoub Insa Correa (Université de Thies) 66 / 84
Les algorithmes de base d’exploration de graphes Applications de l’algo de DFS

début
m(s) = 0
Q=s
Tant que Q ̸= ∅ et m(t) non défini faire
debut
Soit v un élément de Q
retirer v de Q
pour tout v ′ ∈ S(v ) alors
debut
si m(v ′ ) indéfini alors m(v ′ ) = v
si v ′ = t alors CHEMIN(v ′ )
sinon introduire v ′ dans Q
fin
fin
écrire "pas de chemin de s à t dans G"
Fin tant que
fin
Semestre 1, Année académique 2023
Ayoub Insa Correa (Université de Thies) 67 / 84
Les algorithmes de base d’exploration de graphes Applications de l’algo de 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 2023


Ayoub Insa Correa (Université de Thies) 68 / 84
Les algorithmes de base d’exploration de graphes Applications de l’algo de 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 2023


Ayoub Insa Correa (Université de Thies) 69 / 84
Les algorithmes de base d’exploration de graphes Applications de l’algo de DFS

Suite Exercice 1 (TD)

Semestre 1, Année académique 2023


Ayoub Insa Correa (Université de Thies) 70 / 84
Les algorithmes de base d’exploration de graphes Applications de l’algo de 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 2023


Ayoub Insa Correa (Université de Thies) 71 / 84
Annexe 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 2023


Ayoub Insa Correa (Université de Thies) 72 / 84
Annexe 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 2023


Ayoub Insa Correa (Université de Thies) 73 / 84
Annexe 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 2023


Ayoub Insa Correa (Université de Thies) 74 / 84
Annexe 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 2023


Ayoub Insa Correa (Université de Thies) 75 / 84
Annexe 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 2023


Ayoub Insa Correa (Université de Thies) 76 / 84
Annexe 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 2023


Ayoub Insa Correa (Université de Thies) 77 / 84
Annexe Structures de données élémentaires

À 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 quand 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 2023
Ayoub Insa Correa (Université de Thies) 78 / 84
Annexe Structures de données élémentaires

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 2023


Ayoub Insa Correa (Université de Thies) 79 / 84
Annexe Structures de données élémentaires

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(i, j) ∈ E,
aij =
0 sinon

Semestre 1, Année académique 2023


Ayoub Insa Correa (Université de Thies) 80 / 84
Annexe Structures de données élémentaires

Avantages de la représentation par les matrices


d’adjacence

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


est de petite taille ;
▶ 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 2023


Ayoub Insa Correa (Université de Thies) 81 / 84
Annexe Structures de données élémentaires

Exemple de listes et matrices d’adjacence pour un


graphe non orienté

Semestre 1, Année académique 2023


Ayoub Insa Correa (Université de Thies) 82 / 84
Annexe Structures de données élémentaires

Exemple de listes et matrices d’adjacence pour un


graphe orienté

Semestre 1, Année académique 2023


Ayoub Insa Correa (Université de Thies) 83 / 84
Annexe Structures de données élémentaires

Un exemple sur les listes d’adjacence


Soit un graphe dont les listes d’adjacence sont :
Sommet Liste des successeurs Liste des prédécesseurs
1 2 2,4
2 1,4,3 1
3 - 2
4 1 2

1 4

2 3

Semestre 1, Année académique 2023


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

Vous aimerez peut-être aussi