Vous êtes sur la page 1sur 25

Parcours des graphes

IFT 436 - Algorithmes et structures de données


Algorithmes de base sur les Graphes

Rachid Kadouche

Université de Sherbrooke

18 juillet 2013

1
Parcours en largeur (BFS)
Parcours des graphes Parcours en profondeur (DFS)
Tri-Topologique

Algo BFS

Soit G = (S, A) et une racine s ∈ S.


BFS trouve tous les sommets atteignable à partir de s.
Calcule la distance entre s et les sommets.
Produit un Breadth-First-Tree (BFT) de racine s.
Algo fonctionne pour les graphes orienté et non-orienté.

2
Parcours en largeur (BFS)
Parcours des graphes Parcours en profondeur (DFS)
Tri-Topologique

BFS : détails

Assume que nous utilisons une liste d’adjacence


Maintient 4 structures de données
color[u] : la couleur du sommet u ∈ S.
π[u] : le prédécesseur de u.
d[u] : la distance entre s et u.
Q : une liste FIFO pour gérer les sommets gris.

3
Parcours en largeur (BFS)
Parcours des graphes Parcours en profondeur (DFS)
Tri-Topologique

BFS - Pseudo
Algorithme : BFS(G, s)

1 foreach u ∈ S − {s} do
2 color[u] ← Blanc ; d[u] ← ∞ ; π[u] ← NIL;
3 color[s] ← Gris ; d[s] ← 0 ; π[s] ← NIL;
4 Q ← ∅ ; Enqueue(Q,s);
5 while Q 6= ∅ do
6 u ← Dequeue(Q);
7 foreach v ∈ Adj[u] do
8 if color[v] = Blanc then
9 color[v] ← Gris ; d[v] ← d[u] + 1 ; π[v ] ← u;
10 Enqueue(Q,v);

11 color[u] ← Noir;

4
Parcours en largeur (BFS)
Parcours des graphes Parcours en profondeur (DFS)
Tri-Topologique

Exemple BFS

5
Parcours en largeur (BFS)
Parcours des graphes Parcours en profondeur (DFS)
Tri-Topologique

Breadth-First Tree

BFS produit un arbre représenté par π.


Soit G = (S, A) de racine s, on définit le graphe des
prédécesseurs de G, Gπ (Sπ , Aπ ), par :
Sπ = {v ∈ S : π[v ] 6= NIL} ∪ {s}
Aπ = {(π[v ], v ) ∈ A : v ∈ Sπ − {s}}
Notez que le chemin de s vers v dans Gπ est le plus court
chemin de s vers v dans G .

6
Parcours en largeur (BFS)
Parcours des graphes Parcours en profondeur (DFS)
Tri-Topologique

Analyse de l’algorithme BFS


Algorithme : BFS(G, s)

1 foreach u ∈ S − {s} do
2 color[u] ← Blanc ; d[u] ← ∞ ; π[u] ← NIL;
3 color[s] ← Gris ; d[s] ← 0 ; π[s] ← NIL;
4 Q ← ∅ ; Enqueue(Q,s);
5 while Q 6= ∅ do
6 u ← Dequeue(Q);
7 foreach v ∈ Adj[u] do
8 if color[v] = Blanc then
9 color[v] ← Gris ; d[v] ← d[u] + 1 ; π[v ] ← u;
10 Enqueue(Q,v);

11 color[u] ← Noir;

7
Parcours en largeur (BFS)
Parcours des graphes Parcours en profondeur (DFS)
Tri-Topologique

Analyse de l’algorithme BFS


Algorithme : BFS(G, s)

1 foreach u ∈ S − {s} do
2 color[u] ← Blanc ; d[u] ← ∞ ; π[u] ← NIL;
3 color[s] ← Gris ; d[s] ← 0 ; π[s] ← NIL;
4 Q ← ∅ ; Enqueue(Q,s);
5 while Q 6= ∅ do
6 u ← Dequeue(Q);
7 foreach v ∈ Adj[u] do
8 if color[v] = Blanc then
9 color[v] ← Gris ; d[v] ← d[u] + 1 ; π[v ] ← u;
10 Enqueue(Q,v);

11 color[u] ← Noir;

T (A, S) dépend de TBFSligne:5−11 (A, S)

8
Parcours en largeur (BFS)
Parcours des graphes Parcours en profondeur (DFS)
Tri-Topologique

Analyse de l’algorithme BFS


Algorithme : BFS(G, s)

1 foreach u ∈ S − {s} do
2 color[u] ← Blanc ; d[u] ← ∞ ; π[u] ← NIL;
3 color[s] ← Gris ; d[s] ← 0 ; π[s] ← NIL;
4 Q ← ∅ ; Enqueue(Q,s);
5 while Q 6= ∅ do
6 u ← Dequeue(Q);
7 foreach v ∈ Adj[u] do
8 if color[v] = Blanc then
9 color[v] ← Gris ; d[v] ← d[u] + 1 ; π[v ] ← u;
10 Enqueue(Q,v);

11 color[u] ← Noir;

T (A, S) dépend de TBFSligne:5−11 (A, S)


X
TBFSligne:5−11 (A, S) = |Adj[v ]| = O(A) pour tous les sommets v atteignables à partir de s.
v ∈S

9
Parcours en largeur (BFS)
Parcours des graphes Parcours en profondeur (DFS)
Tri-Topologique

Analyse de l’algorithme BFS


Algorithme : BFS(G, s)

1 foreach u ∈ S − {s} do
2 color[u] ← Blanc ; d[u] ← ∞ ; π[u] ← NIL;
3 color[s] ← Gris ; d[s] ← 0 ; π[s] ← NIL;
4 Q ← ∅ ; Enqueue(Q,s);
5 while Q 6= ∅ do
6 u ← Dequeue(Q);
7 foreach v ∈ Adj[u] do
8 if color[v] = Blanc then
9 color[v] ← Gris ; d[v] ← d[u] + 1 ; π[v ] ← u;
10 Enqueue(Q,v);

11 color[u] ← Noir;

10
Parcours en largeur (BFS)
Parcours des graphes Parcours en profondeur (DFS)
Tri-Topologique

Analyse de l’algorithme BFS


Algorithme : BFS(G, s)

1 foreach u ∈ S − {s} do
2 color[u] ← Blanc ; d[u] ← ∞ ; π[u] ← NIL;
3 color[s] ← Gris ; d[s] ← 0 ; π[s] ← NIL;
4 Q ← ∅ ; Enqueue(Q,s);
5 while Q 6= ∅ do
6 u ← Dequeue(Q);
7 foreach v ∈ Adj[u] do
8 if color[v] = Blanc then
9 color[v] ← Gris ; d[v] ← d[u] + 1 ; π[v ] ← u;
10 Enqueue(Q,v);

11 color[u] ← Noir;

T (A, S) = O(S + A)

11
Parcours en largeur (BFS)
Parcours des graphes Parcours en profondeur (DFS)
Tri-Topologique

DFS : détails

Entrée : G(S,A), orienté ou non. (pas de racine)


Sortie :
2 timestamps pour chaque noeud :
d[v ] : début
f [v ] : fin
π[v ] le prédécesseur de v

On colore les sommets :


Blanc : non découvert
Gris découvert mais pas encore exploré toutes les arêtes.
Noir : terminé.

12
Parcours en largeur (BFS)
Parcours des graphes Parcours en profondeur (DFS)
Tri-Topologique

DFS - Pseudo
Algorithme : DFS(G)

1 foreach u ∈ S do
2 color[u] ← Blanc;
3 π[u] ← NIL ;
4 time ← 0;
5 foreach u ∈ S do
6 if color[u] = Blanc then
7 DFS-Visit(u)

Algorithme : DFS-Visit(u)

1 color[u] ← Gris;
2 time ← time + 1;
3 d[u] ← time;
4 foreach v ∈ Adj[u] do
5 if color[v] = Blanc then
6 π[v ] ← u;
7 DFS-Visit(v);

8 color[u] ← Noir;
9 time ← time +1;
10 f[u] ← time;

13
Parcours en largeur (BFS)
Parcours des graphes Parcours en profondeur (DFS)
Tri-Topologique

Exemple DFS

14
Parcours en largeur (BFS)
Parcours des graphes Parcours en profondeur (DFS)
Tri-Topologique

Exemple DFS

15
Parcours en largeur (BFS)
Parcours des graphes Parcours en profondeur (DFS)
Tri-Topologique

Forêt des prédécesseurs

DFS produit une forêt représenté par π


Soit G = (S, A) de racine s, on définit la forêt des
prédécesseurs de G, Gπ (S, Aπ ), par :
Aπ = {(π[v ], v ) : v ∈ S ∧ π[v ] 6= NIL}
Le sous-graphe des prédécesseurs (SGP) d’une DFS forme
une “depth-first forest” composé de plusieurs “depth-first
tree”

16
Parcours en largeur (BFS)
Parcours des graphes Parcours en profondeur (DFS)
Tri-Topologique

Analyse de l’algorithme DFS


Algorithme : DFS(G)

1 foreach u ∈ S do
2 color[u] ← Blanc;
3 π[u] ← NIL ;
4 time ← 0;
5 foreach u ∈ S do
6 if color[u] = Blanc then
7 DFS-Visit(u)

Algorithme : DFS-Visit(u)

1 color[u] ← Gris;
2 time ← time + 1;
3 d[u] ← time;
4 foreach v ∈ Adj[u] do
5 if color[v] = Blanc then
6 π[v ] ← u;
7 DFS-Visit(v);

8 color[u] ← Noir;
9 time ← time +1;
10 f[u] ← time;

17
Parcours en largeur (BFS)
Parcours des graphes Parcours en profondeur (DFS)
Tri-Topologique

Analyse de l’algorithme DFS

18
Parcours en largeur (BFS)
Parcours des graphes Parcours en profondeur (DFS)
Tri-Topologique

Analyse de l’algorithme DFS

T (A, S) = Θ(S) + TDFSligne:5−7 (A, S)

19
Parcours en largeur (BFS)
Parcours des graphes Parcours en profondeur (DFS)
Tri-Topologique

Analyse de l’algorithme DFS

T (A, S) = Θ(S) + TDFSligne:5−7 (A, S)

TDFS−Visit (v ) = |Adj[v ]|
X
TDFSligne:5−7 (A, S) = |Adj[v ]| = Θ(A)
v ∈S

20
Parcours en largeur (BFS)
Parcours des graphes Parcours en profondeur (DFS)
Tri-Topologique

Analyse de l’algorithme DFS

T (A, S) = Θ(S) + TDFSligne:5−7 (A, S)

TDFS−Visit (v ) = |Adj[v ]|
X
TDFSligne:5−7 (A, S) = |Adj[v ]| = Θ(A)
v ∈S

T (A, S) = Θ(S + A)

21
Parcours en largeur (BFS)
Parcours des graphes Parcours en profondeur (DFS)
Tri-Topologique

DFS : Structure en parenthèse

22
Parcours en largeur (BFS)
Parcours des graphes Parcours en profondeur (DFS)
Tri-Topologique

Théorème des parenthèses

Pour un DFS sur G = (S, A) et 2 sommets u et v , seule une


des 3 conditions suivantes est valide :
1 l’intervalle [d[u], f [u]] et [d[v ], f [v ]] sont disjoints et ni u
ni v est un descendant de l’autre dans la DFF
(Depth-First Forest)
2 [d[u], f [u]] est contenu dans [d[v ], f [v ]] et u est un
descendant de v .
3 L’inverse du point 2.

Corolaire : v est un descendant de u dans la DFF ssi


d[u] < d[v ] < f [v ] < f [u]

23
Parcours en largeur (BFS)
Parcours des graphes Parcours en profondeur (DFS)
Tri-Topologique

Tri-Topologique

Opération fondamentale d’un graphe orienté acyclique


(DAG).
Produit un ordonnancement linéaire de tous les noeuds de
G tel que pour une arêtes (u, v ) u apparaı̂t avant v .
Utile dans des application qui veulent représenter la
précédence des événements.
Ses somets sont ordonnés de gauche à droite par ordre
décroissant des dates de fin de traitement
Tous les arcs sont orientés de gauche à droite

24
Parcours en largeur (BFS)
Parcours des graphes Parcours en profondeur (DFS)
Tri-Topologique

Tri-Topologique (Comment le savant Cosinus s’habille le


matin )

25

Vous aimerez peut-être aussi