680 likes | 1.13k Views
Module 4 : Parcours dans un graphe. Plan du module. Parcours en profondeur Parcours en largeur Composantes connexes Recherche de cycles Tri topologique Bi-coloriage d’un graphe. Parcours en profondeur. Utilise l’idée du backtracking
E N D
Plan du module • Parcours en profondeur • Parcours en largeur • Composantes connexes • Recherche de cycles • Tri topologique • Bi-coloriage d’un graphe Parcours dans un graphe
Parcours en profondeur • Utilise l’idée du backtracking • Recherche exhaustive de toutes les possibilités si possible • Retour en arrière (backtrack) s’il n’y a plus de possibilité d’avancement non explorée Parcours dans un graphe
Parcours en profondeur • Marquer tous les nœuds comme « non visités » • Choisir le nœud de départ et le marquer comme visité • À partir de là, effectuer un chemin vers le bas aussi long que possible en ne traitant que les nœuds non encore « visités » (parcours récursif) • Si tous les nœuds ne sont pas encore « visités », choisir un autre nœud « non visité » et recommencer à 3. Parcours dans un graphe
Parcours en profondeur u v w 1/ x z y Parcours dans un graphe
Exemple (DFS) u v w 2/ 1/ x z y Parcours dans un graphe
Exemple (DFS) u v w 2/ 1/ 3/ x z y Parcours dans un graphe
Exemple (DFS) u v w 2/ 1/ 3/ 4/ x z y Parcours dans un graphe
Exemple (DFS) u v w 2/ 1/ 3/ 4/ x z y Parcours dans un graphe
Exemple (DFS) u v w 2/ 1/ 3/ 4/5 x z y Parcours dans un graphe
Exemple (DFS) u v w 2/ 1/ 3/6 4/5 x z y Parcours dans un graphe
Exemple (DFS) u v w 2/7 1/ 3/6 4/5 x z y Parcours dans un graphe
Exemple (DFS) u v w 2/7 1/ 3/6 4/5 x z y Parcours dans un graphe
Exemple (DFS) u v w 2/7 1/8 3/6 4/5 x z y Parcours dans un graphe
Exemple (DFS) u v w 2/7 9/ 1/8 3/6 4/5 x z y Parcours dans un graphe
Exemple (DFS) u v w 2/7 9/ 1/8 3/6 4/5 x z y Parcours dans un graphe
Exemple (DFS) u v w 2/7 9/ 1/8 3/6 4/5 10/ x z y Parcours dans un graphe
Exemple (DFS) u v w 2/7 9/ 1/8 3/6 4/5 10/ x z y Parcours dans un graphe
Exemple (DFS) u v w 2/7 9/ 1/8 3/6 4/5 10/11 x z y Parcours dans un graphe
Exemple (DFS) u v w 2/7 9/12 1/8 3/6 4/5 10/11 x z y Parcours dans un graphe
Parcours en profondeur • PROCEDURE dfs(VAR g : graph; v : integer); • BEGIN • IF NOT finished • THEN BEGIN • discovered[v] := true; • process_vertex(v); • FOR i := 0 TO g.degree[v]-1 DO • BEGIN • y := g.edges[v][i]; • IF NOT discovered[y] • THEN BEGIN • dfs(g,y) • END • ELSE IF NOT processed[y] THEN process_edge(v,y); • IF finished THEN exit • END; • processed[v] := true • END • END; Extrait partiel du programme Pascal Parcours dans un graphe
Parcours en largeur • Marquer tous les nœuds comme « non visités » • Choisir un nœud v de départ et le marquer « visité » • À partir de v: • Visiter tous les nœuds non encore visités adjacents à v • Visiter tous les nœuds accessibles depuis v en suivant 2 arêtes • Visiter tous les nœuds accessibles depuis v en suivant n arêtes En utilisant une file ! • Si tous les nœuds n’ont pas encore été visités, choisir un nœud non encore visité et recommencer à 3. Parcours dans un graphe
Parcours en largeur • Placer le nœud de départ dans la file • Tant que la file n’est pas vide soit n le premier nœud de la file traiter n enlever n de la file placer tous les nœuds adjacents à n et non encore traités dans la file • Fin tant que Parcours dans un graphe
Parcours en largeur • Une file est une structure de données de type FIFO (First In First Out) • Enqueue(x,q) insère l’item x à la fin de q • Dequeue(q) renvoie et enlève l’item en tête de la file • Empty(q) indique si la file est pleine, ne peut plus accepter d’ajouts • Initialize_queue(q) crée une file vide Parcours dans un graphe
Parcours en largeur r s t u 0 v w y x Q: s 0 Parcours dans un graphe
Exemple (BFS) r s t u 0 1 1 v w y x Q: w r 1 1 Parcours dans un graphe
Exemple (BFS) r s t u 2 0 1 2 1 v w y x Q: r t x 1 2 2 Parcours dans un graphe
Exemple (BFS) r s t u 2 0 1 2 2 1 v w y x Q: t x v 2 2 2 Parcours dans un graphe
Exemple (BFS) r s t u 2 0 3 1 2 2 1 v w y x Q: x v u 2 2 3 Parcours dans un graphe
Exemple (BFS) r s t u 2 0 3 1 2 3 2 1 v w y x Q: v u y 2 3 3 Parcours dans un graphe
Exemple (BFS) r s t u 2 0 3 1 2 3 2 1 v w y x Q: u y 3 3 Parcours dans un graphe
Exemple (BFS) r s t u 2 0 3 1 2 3 2 1 v w y x Q: y 3 Parcours dans un graphe
Exemple (BFS) r s t u 2 0 3 1 2 3 2 1 v w y x Q: Parcours dans un graphe
Exemple (BFS) r s t u 2 0 3 1 2 3 2 1 v w y x BF Tree Parcours dans un graphe
Parcours en largeur • WHILE NOT empty(q) DO • BEGIN • v := dequeue(q); • process_vertex(v); • processed[v] := true; • FOR i := 0 TO g.degree[v]-1 DO • BEGIN • IF NOT discovered[g.edges[v][i]] • THEN BEGIN • enqueue(q,g.edges[v][i]); • discovered[g.edges[v][i]] := true; • END; • IF NOT processed[g.edges[v][i]] • THEN process_edge(v,g.edges[v][i]) • END • END • END; • PROCEDURE bfs(VAR g : graph; start : integer); • VAR q : queue; { queue of vertices to visit } • BEGIN • FOR i := 0 TO g.nvertices-1 DO • BEGIN • processed[i] := false; discovered[i] := false; • END; • init_queue(q); • enqueue(q, start); • discovered[start] := true; Extrait partiel du programme Pascal Parcours dans un graphe
Définitions Chemin (de longueur n): Une séquence de nœuds v0, v1, …, vn avec une arête de vi à vi+1 pour chaque 0 <= i < n. Un chemin est simple si tous les nœuds dans le chemin sont distincts. Un cycle est un chemin de longueur 1 ou plus reliant un nœud vi à lui même. Un cycle est simple si le chemin est simple, sauf que les premiers et derniers nœuds sont les même. Parcours dans un graphe
Composantes connexes • Une composante connexe d’un graphe non orienté est l’ensemble maximal de nœuds tel qu’il existe un chemin entre toutes les paires de nœuds de cet ensemble • Elles se déterminent par un parcours (ici DFS) Parcours dans un graphe
Composantes connexes • c := 0; • FOR i := 0 TO g.nvertices-1 DO • IF NOT discovered[i] • THEN BEGIN • c := c+1; • write('Component ',c,': '); • dfs(g,i); • writeln • END Parcours dans un graphe
Recherche de cycles • Une arête arrière (u,v) est telle que v est un père de u dans l’arbre DFS construit pour un graphe. • Toute arête arrière allant de u vers son père v crée un cycle dans le chemin de v à u. Parcours dans un graphe
Recherche de cycles • PROCEDURE process_edge(x,y : integer); • BEGIN • IF parent[x] <> y • THEN BEGIN • write('Cycle from ',y, ' to ', x, ' : '); • find_path(y,x); • writeln • { finished := true} • END • END Parcours dans un graphe
Recherche de cycles • PROCEDURE find_path(start, endv : integer); • BEGIN • IF (start = endv) OR (endv = -1) • THEN write(start:3) • ELSE BEGIN • find_path(start, parent[endv]); • write(endv:3) • END • END; Parcours dans un graphe
Tri topologique • Le tri topologique d'un graphe orienté sans circuit est une numérotation des sommets dans laquelle les descendants d'un sommet de numéro k sont nécessairement de numéro supérieur à k. Parcours dans un graphe
Topological Sort: DFS C 1 2 4 3 G A B 5 D E 6 7 F 8 Un ordre topologique: C G B A D E F H H Parcours dans un graphe
Tri topologique • Soit le graphe orienté acyclique suivant Parcours dans un graphe
Tri topologique • La table indique pour chacun des nœuds (1 à 6) le nombre d’arêtes entrantes (indegree) Parcours dans un graphe
Tri topologique file Parcours dans un graphe
Tri topologique • La valeur en tête de file est enlevée (ici 1). • La valeur indegree de chaque nœud adjacent au nœud enlevé de la file est décrémentée de 1. Le(s) nœud(s) dont l’indegree passe à 0 sont mis dans la file (ici 2). Parcours dans un graphe
Tri topologique file Résultat 1 Parcours dans un graphe
Tri topologique file Résultat 1, 6 Parcours dans un graphe
Tri topologique file Résultat 1, 6, 2 Parcours dans un graphe