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 des graphes Parcours en largeur (BFS) 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 des graphes Parcours en largeur (BFS) 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 des graphes Parcours en largeur (BFS) Parcours en profondeur (DFS) Tri-Topologique BFS - Pseudo Algorithme : BFS(G, s) 1 2 3 4 5 6 7 8 9 10 11 4 foreach u ∈ S − {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); foreach 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; Parcours des graphes Exemple BFS 5 Parcours en largeur (BFS) Parcours en profondeur (DFS) Tri-Topologique Parcours des graphes Parcours en largeur (BFS) 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 des graphes Parcours en largeur (BFS) Parcours en profondeur (DFS) Tri-Topologique Analyse de l’algorithme BFS Algorithme : BFS(G, s) 1 2 3 4 5 6 7 8 9 10 11 7 foreach u ∈ S − {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); foreach 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; Parcours des graphes Parcours en largeur (BFS) Parcours en profondeur (DFS) Tri-Topologique Analyse de l’algorithme BFS Algorithme : BFS(G, s) 1 2 3 4 5 6 7 8 9 10 11 foreach u ∈ S − {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); foreach 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; T (A, S) dépend de TBFSligne:5−11 (A, S) 8 Parcours des graphes Parcours en largeur (BFS) Parcours en profondeur (DFS) Tri-Topologique Analyse de l’algorithme BFS Algorithme : BFS(G, s) 1 2 3 4 5 6 7 8 9 10 11 foreach u ∈ S − {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); foreach 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; T (A, S) dépend de TBFSligne:5−11 (A, S) X |Adj[v ]| = O(A) TBFSligne:5−11 (A, S) = v ∈S 9 pour tous les sommets v atteignables à partir de s. Parcours des graphes Parcours en largeur (BFS) Parcours en profondeur (DFS) Tri-Topologique Analyse de l’algorithme BFS Algorithme : BFS(G, s) 1 2 3 4 5 6 7 8 9 10 11 10 foreach u ∈ S − {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); foreach 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; Parcours des graphes Parcours en largeur (BFS) Parcours en profondeur (DFS) Tri-Topologique Analyse de l’algorithme BFS Algorithme : BFS(G, s) 1 2 3 4 5 6 7 8 9 10 11 foreach u ∈ S − {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); foreach 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; T (A, S) = O(S + A) 11 Parcours des graphes Parcours en largeur (BFS) 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 des graphes 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 2 3 4 5 6 7 color[u] ← Gris; time ← time + 1; d[u] ← time; foreach v ∈ Adj[u] do if color[v] = Blanc then π[v ] ← u; DFS-Visit(v); 8 color[u] ← Noir; 9 time ← time +1; 10 f[u] ← time; 13 Parcours en largeur (BFS) Parcours en profondeur (DFS) Tri-Topologique Parcours des graphes Exemple DFS 14 Parcours en largeur (BFS) Parcours en profondeur (DFS) Tri-Topologique Parcours des graphes Exemple DFS 15 Parcours en largeur (BFS) Parcours en profondeur (DFS) Tri-Topologique Parcours des graphes Parcours en largeur (BFS) 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 des graphes 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 2 3 4 5 6 7 color[u] ← Gris; time ← time + 1; d[u] ← time; foreach v ∈ Adj[u] do if color[v] = Blanc then π[v ] ← u; DFS-Visit(v); 8 color[u] ← Noir; 9 time ← time +1; 10 f[u] ← time; 17 Parcours en largeur (BFS) Parcours en profondeur (DFS) Tri-Topologique Parcours des graphes Analyse de l’algorithme DFS 18 Parcours en largeur (BFS) Parcours en profondeur (DFS) Tri-Topologique Parcours des graphes Parcours en largeur (BFS) Parcours en profondeur (DFS) Tri-Topologique Analyse de l’algorithme DFS T (A, S) = Θ(S) + TDFSligne:5−7 (A, S) 19 Parcours des graphes Parcours en largeur (BFS) 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 ]| TDFSligne:5−7 (A, S) = X v ∈S 20 |Adj[v ]| = Θ(A) Parcours des graphes Parcours en largeur (BFS) 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 ]| TDFSligne:5−7 (A, S) = X v ∈S T (A, S) = Θ(S + A) 21 |Adj[v ]| = Θ(A) Parcours des graphes Parcours en largeur (BFS) Parcours en profondeur (DFS) Tri-Topologique DFS : Structure en parenthèse 22 Parcours des graphes Parcours en largeur (BFS) 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 des graphes Parcours en largeur (BFS) 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 des graphes Parcours en largeur (BFS) Parcours en profondeur (DFS) Tri-Topologique Tri-Topologique (Comment le savant Cosinus s’habille le matin ) 25