Recherche en profondeur (Depth-First Search) et recherche en largeur (Breadth-First Search) (§12.3) Sous-graphes Un sous-graphe S d’un graphe G est un graphe tel que les sommets de S forment un sous-ensemble des sommets de G les arêtes de S forment une sous-collection des arêtes de G Sous-graphe Un sous-graphe couvrant d’un graphe G est sous-graphe contenant tous les sommets de G Sous-graphe couvrant IFT2010, H2004, Sylvie Hamel Université de Montréal Parcours de graphes 1 Graphes connexes Un graphe est connexe s’il existe un chemin entre chaque paire de sommets du graphe Graphe connexe Une composante connexe d’un graphe G est un sous-graphe connexe maximal de G Un graphe non-connexe ayant deux composantes connexes IFT2010, H2004, Sylvie Hamel Université de Montréal Parcours de graphes 2 Arbres et forêts Un arbre est un graphe non-orienté T tel que T est connexe T n’a pas de cycles Arbre Une forêt est un graphe non-orienté qui n’a pas de cycles Les composantes connexes d’une forêt sont des arbres IFT2010, H2004, Sylvie Hamel Université de Montréal Parcours de graphes Forêt 3 Arbres et forêts couvrants Un arbre couvrant d’un graphe connexe est un sous-graphe couvrant qui est un arbre. Un arbre couvrant n’est pas unique sauf si le graphe est un arbre. Graphe Une forêt couvrante d’un graphe est un sousgraphe couvrant qui est une forêt. Arbre couvrant IFT2010, H2004, Sylvie Hamel Université de Montréal Parcours de graphes 4 Parcours en profondeur (Depth-First Search) Un parcours en profondeur d’un graphe G Visite tous les sommets et toutes les arêtes de G Détermine si G est connexe ou non Calcule les composantes connexes de G Calcule une forêt couvrante pour G La complexité en temps d’un parcours en profondeur est O(n+m) L’algorithme de parcours en profondeur peut être modifié pour résoudre d’autres problèmes sur les graphes: trouver et retourner un chemin entre deux sommets trouver un cycle dans un graphe IFT2010, H2004, Sylvie Hamel Université de Montréal Parcours de graphes 5 Parcours en profondeur: Exemple A A Sommets non-explorés Sommets visités Arêtes non-explorées Arêtes sélectionnées Arêtes de retour A B D E D E C A B D C A E B C IFT2010, H2004, Sylvie Hamel Université de Montréal Parcours de graphes 6 Parcours en profondeur: Exemple A B A D E B D C C A A B E D E B E C C IFT2010, H2004, Sylvie Hamel Université de Montréal D Parcours de graphes 7 Analyse du parcours en profondeur Chaque sommet est étiquetté deux fois Une fois “non-exploré” Une fois “visité” Chaque arête est étiquettée deux fois Une fois “non-explorée” Une fois “sélectionnée” ou “retour” L’opération incidentes(s) est appelée pour chaque sommet La complexité en temps du parcours en profondeur est en O(n+m) si on utilise la structure de données “liste d’adjacence” IFT2010, H2004, Sylvie Hamel Université de Montréal Parcours de graphes 8 Chemin entre deux sommets Algorithme trouverChemin(G, v, z) changerÉtiquette(v, VISITÉ) S.empiler(v) si v = z retourner S.éléments() Pour tout e ∈ G.incidentes(v) si Étiquette(e) = NON-EXPLORÉ w ← opposé(v,e) si Étiquette(w) = NON-EXPLORÉ changerÉtiquette(e, SÉLECTIONNÉ) S.empiler(e) trouverChemin(G, w, z) S.dépiler(e) sinon changerÉtiquette(e, RETOUR) S.dépiler(v) IFT2010, H2004, Sylvie Hamel Université de Montréal Parcours de graphes 9 Trouver un cycle dans un graphe Algorithme trouverCycle(G, v, z) changerÉtiquette(v, VISITÉ) S.empiler(v) Pour tout e ∈ G.incidentes(v) si Étiquette(e) = NON-EXPLORÉ w ← opposé(v,e) S.empiler(e) si Étiquette(w) = NON-EXPLORÉ changerÉtiquette(e, SÉLECTIONNÉ) trouverChemin(G, w, z) S.dépiler(e) sinon T ← nouvelle pile vide répéter o ← S.dépiler() T.empiler(o) tant que o = w retourner T.éléments() S.dépiler(v) IFT2010, H2004, Sylvie Hamel Université de Montréal Parcours de graphes 10 Parcours en largeur (Breadth-First Search) Un parcours en largeur d’un graphe G Visite tous les sommets et toutes les arêtes de G Détermine si G est connexe ou non Calcule les composantes connexes de G Calcule une forêt couvrante pour G La complexité en temps d’un parcours en largeur est O(n+m) L’algorithme de parcours en profondeur peut être modifié pour résoudre d’autres problèmes sur les graphes: trouver et retourner un chemin de longueur minimale entre deux sommets trouver un cycle simple, s’il y en a un IFT2010, H2004, Sylvie Hamel Université de Montréal Parcours de graphes 11 Parcours en largeur: Exemple A A Sommets non-explorés Sommets visités Arêtes non-explorées Arêtes sélectionnées Arêtes de retour L0 L1 L0 L1 L0 C E IFT2010, H2004, Sylvie Hamel Université de Montréal C B E A B A D L1 F F A C B E Parcours de graphes D D F 12 Parcours en largeur: Exemple L0 L1 L0 A C B E L0 L1 L2 F A L1 C E C B L0 B L2 D L1 A E D F A C B D D L2 F IFT2010, H2004, Sylvie Hamel Université de Montréal Parcours de graphes E F 13 Parcours en largeur: Exemple L0 L1 L0 L1 A C B L2 E D L1 F A C B L2 E D F A C B L2 L0 E D F IFT2010, H2004, Sylvie Hamel Université de Montréal Parcours de graphes 14 Analyse du parcours en largeur Chaque sommet est étiquetté deux fois Une fois “non-exploré” Une fois “visité” Chaque arête est étiquettée deux fois Une fois “non-explorée” Une fois “sélectionnée” ou “de traverse” Chaque sommet est inséré une fois dans une séquence Li L’opération incidentes(s) est appelée pour chaque sommet La complexité en temps du parcours en profondeur est en O(n+m) si on utilise la structure de données “liste d’adjacence” IFT2010, H2004, Sylvie Hamel Université de Montréal Parcours de graphes 15 Profondeur versus largeur Parcours en profondeur Applications Forêt couvrante, composantes connexes, chemins, cycles Parcours en largeur v v v Plus court chemin L0 A B C E D L1 Parcours en profondeur IFT2010, H2004, Sylvie Hamel Université de Montréal C B L2 F A E D F Parcours en largeur Parcours de graphes 16 Profondeur versus largeur (suite) Arête de retour (v,w) w est un ancêtre de v dans l’arbre des arêtes sélectionnées Arête de traverse (v,w) w est sur le même niveau que v ou dans le prochain niveau dans l’arbre des arêtes sélectionnées L0 A B C E D F Parcours en profondeur IFT2010, H2004, Sylvie Hamel Université de Montréal L1 A C B L2 E D F Parcours en largeur Parcours de graphes 17