1 / 60

Module 4 : Parcours dans un graphe

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

nalani
Download Presentation

Module 4 : Parcours dans un graphe

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Module 4 : Parcours dans un graphe

  2. 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

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

  4. 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

  5. Parcours en profondeur u v w 1/ x z y Parcours dans un graphe

  6. Exemple (DFS) u v w 2/ 1/ x z y Parcours dans un graphe

  7. Exemple (DFS) u v w 2/ 1/ 3/ x z y Parcours dans un graphe

  8. Exemple (DFS) u v w 2/ 1/ 3/ 4/ x z y Parcours dans un graphe

  9. Exemple (DFS) u v w 2/ 1/ 3/ 4/ x z y Parcours dans un graphe

  10. Exemple (DFS) u v w 2/ 1/ 3/ 4/5 x z y Parcours dans un graphe

  11. Exemple (DFS) u v w 2/ 1/ 3/6 4/5 x z y Parcours dans un graphe

  12. Exemple (DFS) u v w 2/7 1/ 3/6 4/5 x z y Parcours dans un graphe

  13. Exemple (DFS) u v w 2/7 1/ 3/6 4/5 x z y Parcours dans un graphe

  14. Exemple (DFS) u v w 2/7 1/8 3/6 4/5 x z y Parcours dans un graphe

  15. Exemple (DFS) u v w 2/7 9/ 1/8 3/6 4/5 x z y Parcours dans un graphe

  16. Exemple (DFS) u v w 2/7 9/ 1/8 3/6 4/5 x z y Parcours dans un graphe

  17. Exemple (DFS) u v w 2/7 9/ 1/8 3/6 4/5 10/ x z y Parcours dans un graphe

  18. Exemple (DFS) u v w 2/7 9/ 1/8 3/6 4/5 10/ x z y Parcours dans un graphe

  19. Exemple (DFS) u v w 2/7 9/ 1/8 3/6 4/5 10/11 x z y Parcours dans un graphe

  20. Exemple (DFS) u v w 2/7 9/12 1/8 3/6 4/5 10/11 x z y Parcours dans un graphe

  21. 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

  22. 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

  23. 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

  24. 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

  25. Parcours en largeur r s t u    0     v w y x Q: s 0 Parcours dans un graphe

  26. Exemple (BFS) r s t u   0 1    1 v w y x Q: w r 1 1 Parcours dans un graphe

  27. 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

  28. 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

  29. 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

  30. 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

  31. 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

  32. 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

  33. Exemple (BFS) r s t u 2 0 3 1 2 3 2 1 v w y x Q: Parcours dans un graphe

  34. Exemple (BFS) r s t u 2 0 3 1 2 3 2 1 v w y x BF Tree Parcours dans un graphe

  35. 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

  36. 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

  37. 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

  38. 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

  39. 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

  40. 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

  41. 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

  42. 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

  43. 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

  44. Tri topologique • Soit le graphe orienté acyclique suivant Parcours dans un graphe

  45. Tri topologique • La table indique pour chacun des nœuds (1 à 6) le nombre d’arêtes entrantes (indegree) Parcours dans un graphe

  46. Tri topologique file Parcours dans un graphe

  47. 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

  48. Tri topologique file Résultat 1 Parcours dans un graphe

  49. Tri topologique file Résultat 1, 6 Parcours dans un graphe

  50. Tri topologique file Résultat 1, 6, 2 Parcours dans un graphe

More Related