Algorithmique des graphes 4 — Graphes pond´er´es, la suite; graphes orient´es Anthony Labarre 17 f´evrier 2021
Texte intégral
(2) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Correction de l’algorithme de Prim. • On a vu la fois passée l’algorithme de Prim, qui construit un ACPM à partir d’un sommet donné pour la composante connexe qui le contient ; • Prouvons aujourd’hui que cet algorithme fonctionne (reprenez le pseudocode !) ;. 2.
(3) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Correction de l’algorithme de Prim. On doit prouver que : 1. l’algorithme se termine :. 3.
(4) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Correction de l’algorithme de Prim. On doit prouver que : 1. l’algorithme se termine : évident, on arrête quand le tas est vide, sa taille maximum est |E |, et chaque itération en extrait au moins un élément ;. 4.
(5) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Correction de l’algorithme de Prim. On doit prouver que : 1. l’algorithme se termine : évident, on arrête quand le tas est vide, sa taille maximum est |E |, et chaque itération en extrait au moins un élément ;. 2. il renvoie un :.
(6) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Correction de l’algorithme de Prim. On doit prouver que : 1. l’algorithme se termine : évident, on arrête quand le tas est vide, sa taille maximum est |E |, et chaque itération en extrait au moins un élément ;. 2. il renvoie un : 1. arbre :.
(7) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Correction de l’algorithme de Prim. On doit prouver que : 1. l’algorithme se termine : évident, on arrête quand le tas est vide, sa taille maximum est |E |, et chaque itération en extrait au moins un élément ;. 2. il renvoie un : 1. arbre : oui, on rejette explicitement toute arête créant un cycle ;.
(8) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Correction de l’algorithme de Prim. On doit prouver que : 1. l’algorithme se termine : évident, on arrête quand le tas est vide, sa taille maximum est |E |, et chaque itération en extrait au moins un élément ;. 2. il renvoie un : 1. arbre : oui, on rejette explicitement toute arête créant un cycle ;. 2. couvrant :. 8.
(9) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Correction de l’algorithme de Prim. On doit prouver que : 1. l’algorithme se termine : évident, on arrête quand le tas est vide, sa taille maximum est |E |, et chaque itération en extrait au moins un élément ;. 2. il renvoie un : 1. arbre : oui, on rejette explicitement toute arête créant un cycle ;. 2. couvrant : oui (si G connexe), chaque itération ajoute une arête contenant un sommet hors de l’arbre ;. 9.
(10) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Correction de l’algorithme de Prim. On doit prouver que : 1. l’algorithme se termine : évident, on arrête quand le tas est vide, sa taille maximum est |E |, et chaque itération en extrait au moins un élément ;. 2. il renvoie un : 1. arbre : oui, on rejette explicitement toute arête créant un cycle ;. 2. couvrant : oui (si G connexe), chaque itération ajoute une arête contenant un sommet hors de l’arbre ;. 3. de poids minimum : c’est ce qu’on va voir.. 10.
(11) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. L’arbre couvrant que calcule Prim est de poids minimum Procédons par induction sur |V (T )|, en montrant qu’à chaque étape, il existe un ACPM Topt contenant T . 1 cas de base : |V (T )| = 1, trivial ;. 11.
(12) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. L’arbre couvrant que calcule Prim est de poids minimum Procédons par induction sur |V (T )|, en montrant qu’à chaque étape, il existe un ACPM Topt contenant T . 1 cas de base : |V (T )| = 1, trivial ; 2 induction :. 12.
(13) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. L’arbre couvrant que calcule Prim est de poids minimum Procédons par induction sur |V (T )|, en montrant qu’à chaque étape, il existe un ACPM Topt contenant T . 1 cas de base : |V (T )| = 1, trivial ; 2 induction :. • hypothèse d’induction (HI) :. 13.
(14) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. L’arbre couvrant que calcule Prim est de poids minimum Procédons par induction sur |V (T )|, en montrant qu’à chaque étape, il existe un ACPM Topt contenant T . 1 cas de base : |V (T )| = 1, trivial ; 2 induction :. • hypothèse d’induction (HI) : il existe un ACPM Topt contenant T , avec |V (T )| = p < |V (G )|.. 14.
(15) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. L’arbre couvrant que calcule Prim est de poids minimum Procédons par induction sur |V (T )|, en montrant qu’à chaque étape, il existe un ACPM Topt contenant T . 1 cas de base : |V (T )| = 1, trivial ; 2 induction :. • hypothèse d’induction (HI) : il existe un ACPM Topt contenant T , avec |V (T )| = p < |V (G )|. • à prouver :.
(16) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. L’arbre couvrant que calcule Prim est de poids minimum Procédons par induction sur |V (T )|, en montrant qu’à chaque étape, il existe un ACPM Topt contenant T . 1 cas de base : |V (T )| = 1, trivial ; 2 induction :. • hypothèse d’induction (HI) : il existe un ACPM Topt contenant T , avec |V (T )| = p < |V (G )|. • à prouver : HI ⇒ ∃ ACPM Topt contenant T ∪ e (la nouvelle arête sûre sélectionnée) ;.
(17) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. L’arbre couvrant que calcule Prim est de poids minimum Procédons par induction sur |V (T )|, en montrant qu’à chaque étape, il existe un ACPM Topt contenant T . 1 cas de base : |V (T )| = 1, trivial ; 2 induction :. • hypothèse d’induction (HI) : il existe un ACPM Topt contenant T , avec |V (T )| = p < |V (G )|. • à prouver : HI ⇒ ∃ ACPM Topt contenant T ∪ e (la nouvelle arête sûre sélectionnée) ; • si e ∈ Topt , alors T ∪ e ⊆ Topt (cf. HI) ;.
(18) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. L’arbre couvrant que calcule Prim est de poids minimum Procédons par induction sur |V (T )|, en montrant qu’à chaque étape, il existe un ACPM Topt contenant T . 1 cas de base : |V (T )| = 1, trivial ; 2 induction :. • hypothèse d’induction (HI) : il existe un ACPM Topt contenant T , avec |V (T )| = p < |V (G )|. • à prouver : HI ⇒ ∃ ACPM Topt contenant T ∪ e (la nouvelle arête sûre sélectionnée) ; 0 • si e ∈ Topt , alors T ∪ e ⊆ Topt (cf. HI) ; sinon, on construit un Topt contenant T ∪ e comme suit :.
(19) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. L’arbre couvrant que calcule Prim est de poids minimum Procédons par induction sur |V (T )|, en montrant qu’à chaque étape, il existe un ACPM Topt contenant T . 1 cas de base : |V (T )| = 1, trivial ; 2 induction :. • hypothèse d’induction (HI) : il existe un ACPM Topt contenant T , avec |V (T )| = p < |V (G )|. • à prouver : HI ⇒ ∃ ACPM Topt contenant T ∪ e (la nouvelle arête sûre sélectionnée) ; 0 • si e ∈ Topt , alors T ∪ e ⊆ Topt (cf. HI) ; sinon, on construit un Topt contenant T ∪ e comme suit : • Topt est un arbre couvrant ⇒ Topt ∪ e contient un cycle C ;.
(20) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. L’arbre couvrant que calcule Prim est de poids minimum Procédons par induction sur |V (T )|, en montrant qu’à chaque étape, il existe un ACPM Topt contenant T . 1 cas de base : |V (T )| = 1, trivial ; 2 induction :. • hypothèse d’induction (HI) : il existe un ACPM Topt contenant T , avec |V (T )| = p < |V (G )|. • à prouver : HI ⇒ ∃ ACPM Topt contenant T ∪ e (la nouvelle arête sûre sélectionnée) ; 0 • si e ∈ Topt , alors T ∪ e ⊆ Topt (cf. HI) ; sinon, on construit un Topt contenant T ∪ e comme suit : • Topt est un arbre couvrant ⇒ Topt ∪ e contient un cycle C ; • e est de poids minimum ⇒ ∀ f ∈ C : w (f ) ≥ w (e) ;.
(21) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. L’arbre couvrant que calcule Prim est de poids minimum Procédons par induction sur |V (T )|, en montrant qu’à chaque étape, il existe un ACPM Topt contenant T . 1 cas de base : |V (T )| = 1, trivial ; 2 induction :. • hypothèse d’induction (HI) : il existe un ACPM Topt contenant T , avec |V (T )| = p < |V (G )|. • à prouver : HI ⇒ ∃ ACPM Topt contenant T ∪ e (la nouvelle arête sûre sélectionnée) ; 0 • si e ∈ Topt , alors T ∪ e ⊆ Topt (cf. HI) ; sinon, on construit un Topt contenant T ∪ e comme suit : • Topt est un arbre couvrant ⇒ Topt ∪ e contient un cycle C ; • e est de poids minimum ⇒ ∀ f ∈ C : w (f ) ≥ w (e) ; 0 • Topt = Topt ∪ e \ f contient T ∪ e ; et 0 w (Topt ) = w (Topt ) + w (e) − w (f ) ≤ w (Topt ) ;.
(22) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Plus courts chemins dans un graphe. • Les graphes pondérés modélisent fréquemment des réseaux routiers ; • Comment faire pour trouver un chemin de moindre coût entre deux sommets ? • Si le graphe n’était pas pondéré, comment calculerait-on un plus court chemin entre deux sommets ?. 22.
(23) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. ACPM et plus courts chemins Comme le montre l’exemple suivant, les algorithmes de calcul d’un arbre couvrant de poids minimum ne fonctionneront pas pour atteindre cet objectif en général.. Exemple 1 (plus courts chemins depuis 0) 2. 2. 1. 3 1. 1 2. 2 2 3. 3. 0. 4. 1. 2 2 3. 1 0. 1. 3 1 0 4. (1) (2) l’ACPM de poids 6 “rate” le plus court chemin 0–3 ; on a bien tous les plus courts chemins, mais le poids de l’arbre n’est pas minimum ;.
(24) Plus courts chemins. Graphes orientés. L’algorithme de Dijkstra. Parcours. Détection de cycles. Fermeture transitive.
(25) Plus courts chemins. Graphes orientés. Parcours. L’algorithme de Dijkstra. • Attention :. “Dij” =. “Day” ;. Détection de cycles. Fermeture transitive.
(26) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. L’algorithme de Dijkstra. • Attention :. “Dij” =. “Day” ;. • L’algorithme de Dijkstra construit un arbre des plus courts chemins :.
(27) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. L’algorithme de Dijkstra. • Attention :. “Dij” =. “Day” ;. • L’algorithme de Dijkstra construit un arbre des plus courts chemins : • la racine de cet arbre est le sommet de départ (la source) ;.
(28) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. L’algorithme de Dijkstra. • Attention :. “Dij” =. “Day” ;. • L’algorithme de Dijkstra construit un arbre des plus courts chemins : • la racine de cet arbre est le sommet de départ (la source) ; • l’arbre ne contient qu’un chemin de poids minimum entre la source et chaque sommet du graphe..
(29) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. L’algorithme de Dijkstra. • Attention :. “Dij” =. “Day” ;. • L’algorithme de Dijkstra construit un arbre des plus courts chemins : • la racine de cet arbre est le sommet de départ (la source) ; • l’arbre ne contient qu’un chemin de poids minimum entre la source et chaque sommet du graphe.. • Hypothèses : le graphe est simple et sans arête de poids négatif..
(30) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Description de l’algorithme de Dijkstra • L’algorithme maintient en permanence un ensemble S de sommets déjà traités ;.
(31) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Description de l’algorithme de Dijkstra • L’algorithme maintient en permanence un ensemble S de sommets déjà traités ; • À chaque étape de l’algorithme, on examine le sommet non traité le plus proche, et on l’utilise pour découvrir de nouveaux raccourcis ;.
(32) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Description de l’algorithme de Dijkstra • L’algorithme maintient en permanence un ensemble S de sommets déjà traités ; • À chaque étape de l’algorithme, on examine le sommet non traité le plus proche, et on l’utilise pour découvrir de nouveaux raccourcis ; traités v1 v2 s .. . vk.
(33) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Description de l’algorithme de Dijkstra • L’algorithme maintient en permanence un ensemble S de sommets déjà traités ; • À chaque étape de l’algorithme, on examine le sommet non traité le plus proche, et on l’utilise pour découvrir de nouveaux raccourcis ; traités v1 v2 u. s .. . vk. prochain sommet.
(34) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Description de l’algorithme de Dijkstra • L’algorithme maintient en permanence un ensemble S de sommets déjà traités ; • À chaque étape de l’algorithme, on examine le sommet non traité le plus proche, et on l’utilise pour découvrir de nouveaux raccourcis ; traités w1. v1 v2 u. s. prochain sommet. .. . wp. vk. w2.
(35) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Description de l’algorithme de Dijkstra • L’algorithme maintient en permanence un ensemble S de sommets déjà traités ; • À chaque étape de l’algorithme, on examine le sommet non traité le plus proche, et on l’utilise pour découvrir de nouveaux raccourcis ; traités w1. v1 v2 u. s. prochain sommet. .. . wp. vk. w2.
(36) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Description de l’algorithme de Dijkstra • L’algorithme maintient en permanence un ensemble S de sommets déjà traités ; • À chaque étape de l’algorithme, on examine le sommet non traité le plus proche, et on l’utilise pour découvrir de nouveaux raccourcis ; traités w1. v1 v2 u. s. prochain sommet. .. . wp. vk. w2. • Attention : on ne traite chaque sommet qu’une fois, mais la distance d’un sommet déjà traité peut changer !.
(37) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Déroulement de l’algorithme de Dijkstra Exemple 2 (source = 0) +∞ +∞. 3. 9. 2. 2 1 6 1 +∞. 5. 4. +∞. 10 7 0 0. 37.
(38) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Déroulement de l’algorithme de Dijkstra Exemple 2 (source = 0) +∞ +∞. 3. 9. 2. 2 1 6 1 +∞. 5. 4. +∞. 10 7 0 0. 38.
(39) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Déroulement de l’algorithme de Dijkstra Exemple 2 (source = 0) +∞ +∞. 3. 9. 2. 2 1 6 1 +∞. 5. 4. +∞. 10 7 0 0. 39.
(40) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Déroulement de l’algorithme de Dijkstra Exemple 2 (source = 0) 5 +∞. 3. 9. 2. 2 1 6 1 7. 5. 4. 10. 10 7 0 0. 40.
(41) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Déroulement de l’algorithme de Dijkstra Exemple 2 (source = 0) 5 +∞. 3. 9. 2. 2 1 6 1 7. 5. 4. 10. 10 7 0 0. 41.
(42) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Déroulement de l’algorithme de Dijkstra Exemple 2 (source = 0) 5 +∞. 3. 9. 2. 2 1 6 1 7. 5. 4. 10. 10 7 0 0. 42.
(43) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Déroulement de l’algorithme de Dijkstra Exemple 2 (source = 0) 5 14. 3. 9. 2. 2 1 6 1 7. 5. 4. 7. 10 7 0 0. 43.
(44) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Déroulement de l’algorithme de Dijkstra Exemple 2 (source = 0) 5 14. 3. 9. 2. 2 1 6 1 7. 5. 4. 7. 10 7 0 0. 44.
(45) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Déroulement de l’algorithme de Dijkstra Exemple 2 (source = 0) 5 14. 3. 9. 2. 2 1 6 1 7. 5. 4. 7. 10 7 0 0. 45.
(46) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Déroulement de l’algorithme de Dijkstra Exemple 2 (source = 0) 5 13. 3. 9. 2. 2 1 6 1 7. 5. 4. 7. 10 7 0 0. 46.
(47) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Déroulement de l’algorithme de Dijkstra Exemple 2 (source = 0) 5 13. 3. 9. 2. 2 1 6 1 7. 5. 4. 7. 10 7 0 0. 47.
(48) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Déroulement de l’algorithme de Dijkstra Exemple 2 (source = 0) 5 13. 3. 9. 2. 2 1 6 1 7. 5. 4. 7. 10 7 0 0. 48.
(49) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Déroulement de l’algorithme de Dijkstra Exemple 2 (source = 0) 5 8. 3. 9. 2. 2 1 6 1 7. 5. 4. 7. 10 7 0 0. 49.
(50) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Déroulement de l’algorithme de Dijkstra Exemple 2 (source = 0) 5 8. 3. 9. 2. 2 1 6 1 7. 5. 4. 7. 10 7 0 0. 50.
(51) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Déroulement de l’algorithme de Dijkstra Exemple 2 (source = 0) 5 8. 3. 9. 2. 2 1 6 1 7. 5. 4. 7. 10 7 0 0. 51.
(52) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Déroulement de l’algorithme de Dijkstra Exemple 2 (source = 0) 5 8. 3. 9. 2. 2 1 6 1 7. 5. 4. 7. 10 7 0 0. 52.
(53) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Déroulement de l’algorithme de Dijkstra Les coulisses. Exemple 2 (source = 0). distances :. +∞. étape 0 (a). +∞. 3. 9. 2. 2 1 6 1 +∞. 5. 4 10. 7 0 0. +∞. 1. 2. 3. 4. 0 +∞ +∞ +∞ +∞. (b). 0. 7. +∞. 5. (c). 0. 7. 14. 5. 10 7. (d). 0. 7. 13. 5. 7. (e). 0. 7. 8. 5. 7. (f). 0. 7. 8. 5. 7.
(54) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Déroulement de l’algorithme de Dijkstra Les coulisses. Exemple 2 (source = 0). distances :. +∞. étape 0 (a). +∞. 3. 9. 2. 2 1 6. 5. 4. +∞. 1. 2. 3. 4. 0 +∞ +∞ +∞ +∞. (b). 0. 7. +∞. 5. (c). 0. 7. 14. 5. 10 7. (d). 0. 7. 13. 5. 7. (e). 0. 7. 8. 5. 7. (f). 0. 7. 8. 5. 7. 0 1 2 3 4. 1 +∞. 10 7 0 0. parents :.
(55) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Déroulement de l’algorithme de Dijkstra Les coulisses. Exemple 2 (source = 0). distances :. +∞. étape 0 (a). +∞. 3. 9. 2. 2 1 6. 5. 4. +∞. 1. 2. 3. 4. 0 +∞ +∞ +∞ +∞. (b). 0. 7. +∞. 5. (c). 0. 7. 14. 5. 10 7. (d). 0. 7. 13. 5. 7. (e). 0. 7. 8. 5. 7. (f). 0. 7. 8. 5. 7. 0 1 2 3 4. 1 +∞. 10 7 0 0. parents :.
(56) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Déroulement de l’algorithme de Dijkstra Les coulisses. Exemple 2 (source = 0). distances :. +∞. étape 0 (a). +∞. 3. 9. 2. 2 1 6. 5. 4. +∞. 1. 2. 3. 4. 0 +∞ +∞ +∞ +∞. (b). 0. 7. +∞. 5. (c). 0. 7. 14. 5. 10 7. (d). 0. 7. 13. 5. 7. (e). 0. 7. 8. 5. 7. (f). 0. 7. 8. 5. 7. 0 1 2 3 4. 1 +∞. 10 7 0 0. parents :.
(57) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Déroulement de l’algorithme de Dijkstra Les coulisses. Exemple 2 (source = 0). distances : étape 0. 5 +∞. (a). 3. 9. 2. 2 1 6 1 7. 5. 4 10. 7 0 0. 10. 1. 2. 3. 4. 0 +∞ +∞ +∞ +∞. (b). 0. 7. +∞. 5. (c). 0. 7. 14. 5. 10 7. (d). 0. 7. 13. 5. 7. (e). 0. 7. 8. 5. 7. (f). 0. 7. 8. 5. 7. parents :. 0 1 2 3 4 0 0 0.
(58) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Déroulement de l’algorithme de Dijkstra Les coulisses. Exemple 2 (source = 0). distances : étape 0. 5 +∞. (a). 3. 9. 2. 2 1 6 1 7. 5. 4 10. 7 0 0. 10. 1. 2. 3. 4. 0 +∞ +∞ +∞ +∞. (b). 0. 7. +∞. 5. (c). 0. 7. 14. 5. 10 7. (d). 0. 7. 13. 5. 7. (e). 0. 7. 8. 5. 7. (f). 0. 7. 8. 5. 7. parents :. 0 1 2 3 4 0 0 0.
(59) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Déroulement de l’algorithme de Dijkstra Les coulisses. Exemple 2 (source = 0). distances : étape 0. 5 +∞. (a). 3. 9. 2. 2 1 6 1 7. 5. 4 10. 7 0 0. 10. 1. 2. 3. 4. 0 +∞ +∞ +∞ +∞. (b). 0. 7. +∞. 5. (c). 0. 7. 14. 5. 10 7. (d). 0. 7. 13. 5. 7. (e). 0. 7. 8. 5. 7. (f). 0. 7. 8. 5. 7. parents :. 0 1 2 3 4 0 0 0.
(60) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Déroulement de l’algorithme de Dijkstra Les coulisses. Exemple 2 (source = 0). distances : étape 0. 5 14. (a). 3. 9. 2. 2 1 6 1 7. 5. 4 10. 7 0 0. 7. 1. 2. 3. 4. 0 +∞ +∞ +∞ +∞. (b). 0. 7. +∞. 5. (c). 0. 7. 14. 5. 10 7. (d). 0. 7. 13. 5. 7. (e). 0. 7. 8. 5. 7. (f). 0. 7. 8. 5. 7. parents :. 0 1 2 3 4 0 3 0 3.
(61) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Déroulement de l’algorithme de Dijkstra Les coulisses. Exemple 2 (source = 0). distances : étape 0. 5 14. (a). 3. 9. 2. 2 1 6 1 7. 5. 4 10. 7 0 0. 7. 1. 2. 3. 4. 0 +∞ +∞ +∞ +∞. (b). 0. 7. +∞. 5. (c). 0. 7. 14. 5. 10 7. (d). 0. 7. 13. 5. 7. (e). 0. 7. 8. 5. 7. (f). 0. 7. 8. 5. 7. parents :. 0 1 2 3 4 0 3 0 3.
(62) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Déroulement de l’algorithme de Dijkstra Les coulisses. Exemple 2 (source = 0). distances : étape 0. 5 14. (a). 3. 9. 2. 2 1 6 1 7. 5. 4 10. 7 0 0. 7. 1. 2. 3. 4. 0 +∞ +∞ +∞ +∞. (b). 0. 7. +∞. 5. (c). 0. 7. 14. 5. 10 7. (d). 0. 7. 13. 5. 7. (e). 0. 7. 8. 5. 7. (f). 0. 7. 8. 5. 7. parents :. 0 1 2 3 4 0 3 0 3.
(63) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Déroulement de l’algorithme de Dijkstra Les coulisses. Exemple 2 (source = 0). distances : étape 0. 5 13. (a). 3. 9. 2. 2 1 6 1 7. 5. 4 10. 7 0 0. 7. 1. 2. 3. 4. 0 +∞ +∞ +∞ +∞. (b). 0. 7. +∞. 5. (c). 0. 7. 14. 5. 10 7. (d). 0. 7. 13. 5. 7. (e). 0. 7. 8. 5. 7. (f). 0. 7. 8. 5. 7. parents :. 0 1 2 3 4 0 1 0 3.
(64) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Déroulement de l’algorithme de Dijkstra Les coulisses. Exemple 2 (source = 0). distances : étape 0. 5 13. (a). 3. 9. 2. 2 1 6 1 7. 5. 4 10. 7 0 0. 7. 1. 2. 3. 4. 0 +∞ +∞ +∞ +∞. (b). 0. 7. +∞. 5. (c). 0. 7. 14. 5. 10 7. (d). 0. 7. 13. 5. 7. (e). 0. 7. 8. 5. 7. (f). 0. 7. 8. 5. 7. parents :. 0 1 2 3 4 0 1 0 3.
(65) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Déroulement de l’algorithme de Dijkstra Les coulisses. Exemple 2 (source = 0). distances : étape 0. 5 13. (a). 3. 9. 2. 2 1 6 1 7. 5. 4 10. 7 0 0. 7. 1. 2. 3. 4. 0 +∞ +∞ +∞ +∞. (b). 0. 7. +∞. 5. (c). 0. 7. 14. 5. 10 7. (d). 0. 7. 13. 5. 7. (e). 0. 7. 8. 5. 7. (f). 0. 7. 8. 5. 7. parents :. 0 1 2 3 4 0 1 0 3.
(66) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Déroulement de l’algorithme de Dijkstra Les coulisses. Exemple 2 (source = 0). distances : étape 0. 5 8. (a). 3. 9. 2. 2 1 6 1 7. 5. 4 10. 7 0 0. 7. 1. 2. 3. 4. 0 +∞ +∞ +∞ +∞. (b). 0. 7. +∞. 5. (c). 0. 7. 14. 5. 10 7. (d). 0. 7. 13. 5. 7. (e). 0. 7. 8. 5. 7. (f). 0. 7. 8. 5. 7. parents :. 0 1 2 3 4 0 4 0 3.
(67) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Déroulement de l’algorithme de Dijkstra Les coulisses. Exemple 2 (source = 0). distances : étape 0. 5 8. (a). 3. 9. 2. 2 1 6 1 7. 5. 4 10. 7 0 0. 7. 1. 2. 3. 4. 0 +∞ +∞ +∞ +∞. (b). 0. 7. +∞. 5. (c). 0. 7. 14. 5. 10 7. (d). 0. 7. 13. 5. 7. (e). 0. 7. 8. 5. 7. (f). 0. 7. 8. 5. 7. parents :. 0 1 2 3 4 0 4 0 3.
(68) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Déroulement de l’algorithme de Dijkstra Les coulisses. Exemple 2 (source = 0). distances : étape 0. 5 8. (a). 3. 9. 2. 2 1 6 1 7. 5. 4 10. 7 0 0. 7. 1. 2. 3. 4. 0 +∞ +∞ +∞ +∞. (b). 0. 7. +∞. 5. (c). 0. 7. 14. 5. 10 7. (d). 0. 7. 13. 5. 7. (e). 0. 7. 8. 5. 7. (f). 0. 7. 8. 5. 7. parents :. 0 1 2 3 4 0 4 0 3.
(69) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Déroulement de l’algorithme de Dijkstra Les coulisses. Exemple 2 (source = 0). distances : étape 0. 5 8. (a). 3. 9. 2. 2 1 6 1 7. 5. 4 10. 7 0 0. 7. 1. 2. 3. 4. 0 +∞ +∞ +∞ +∞. (b). 0. 7. +∞. 5. (c). 0. 7. 14. 5. 10 7. (d). 0. 7. 13. 5. 7. (e). 0. 7. 8. 5. 7. (f). 0. 7. 8. 5. 7. parents :. 0 1 2 3 4 0 4 0 3.
(70) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Poids négatifs. L’algorithme de Dijkstra ne fonctionne (en général) pas s’il y a des arêtes de poids négatif. s’attendre à ce que l’algorithme fonctionne.. Exemple 3 (plus courts chemins depuis 0) 1 1. 2 0. 1 2. 1. -1. 1. 1. -1. 1. 2 0. 1. -1. 1. 2 0. 1. (1) (2) la solution “rate” le plus court chemin 0–2–1 ; la solution “rate” le plus court chemin 0–1–2 ;. 70.
(71) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Extraction du sommet le plus proche L’extraction du minimum peut se faire à l’aide d’un algorithme naı̈f : Algorithme 1 : ExtraireSommetLePlusProche(S,. distances). Entrées : un ensemble S de sommets, la distance de chaque sommet de S. Résultat : le sommet de S le plus proche est extrait et renvoyé. 1 2 3 4 5 6 7 8. sommet ← nil; distance min ← +∞; pour chaque candidat ∈ S faire si distances[candidat] < distance min alors sommet ← candidat; distance min ← distances[candidat]; si sommet 6= nil alors S ← S\ sommet ; renvoyer sommet;.
(72) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Extraction du sommet le plus proche L’extraction du minimum peut se faire à l’aide d’un algorithme naı̈f : Algorithme 1 : ExtraireSommetLePlusProche(S,. distances). Entrées : un ensemble S de sommets, la distance de chaque sommet de S. Résultat : le sommet de S le plus proche est extrait et renvoyé. 1 2 3 4 5 6 7 8. sommet ← nil; distance min ← +∞; pour chaque candidat ∈ S faire si distances[candidat] < distance min alors sommet ← candidat; distance min ← distances[candidat]; si sommet 6= nil alors S ← S\ sommet ; renvoyer sommet;. Un tas comme pour Prim serait plus efficace ; mais attention, ici, les poids des éléments changent en cours d’exécution ! 72.
(73) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. L’algorithme de Dijkstra proprement dit Algorithme 2 :. 1 2 3 4 5 6 7 8. 9. Dijkstra(G , source). Entrées : un graphe pondéré non orienté G , un sommet source. Sortie : la longueur d’un plus court chemin de la source à chacun des sommets du graphe (+∞ pour les sommets non accessibles). a traiter ← G .sommets(); distances ← tableau(G .nombre sommets(), +∞); distances[source] ← 0; tant que a traiter.pas vide() faire u ← ExtraireSommetLePlusProche(a traiter, distances); si u = nil alors renvoyer distances ; pour chaque v ∈ G .voisins(u) faire distances[v ] ← min(distances[v ], distances[u] + G .poids arête(u, v )); renvoyer distances;. 73.
(74) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Complexité. • On passe O(|V |) fois dans la boucle principale ;. 74.
(75) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Complexité. • On passe O(|V |) fois dans la boucle principale ; • Extraire chaque sommet coûte O(|S|) = O(|V |) ;. 75.
(76) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Complexité. • On passe O(|V |) fois dans la boucle principale ; • Extraire chaque sommet coûte O(|S|) = O(|V |) ; • On examine chaque arête deux fois ;. ⇒ O(|E | + |V |2 ) = O(|V |2 ).. 76.
(77) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Complexité. • On passe O(|V |) fois dans la boucle principale ; • Extraire chaque sommet coûte O(|S|) = O(|V |) ; • On examine chaque arête deux fois ;. ⇒ O(|E | + |V |2 ) = O(|V |2 ). • Une structure de tas adaptée permet de rabaisser la complexité à O(|E | + |V | log |V |) ;. 77.
(78) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Motivations. • Certains réseaux sont naturellement asymétriques (Twitter, réseaux routiers, graphes de dépendances, généalogies, . . . ) ;. 78.
(79) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Motivations. • Certains réseaux sont naturellement asymétriques (Twitter, réseaux routiers, graphes de dépendances, généalogies, . . . ) ; • Il faut donc pouvoir représenter des graphes avec des liens asymétriques ;. 79.
(80) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Motivations. • Certains réseaux sont naturellement asymétriques (Twitter, réseaux routiers, graphes de dépendances, généalogies, . . . ) ; • Il faut donc pouvoir représenter des graphes avec des liens asymétriques ; • Ces graphes orientés contiennent des arcs (u, v ) au lieu d’arêtes {u, v } : la présence d’un lien dans un sens n’implique donc plus la présence de ce lien dans l’autre sens ;. 80.
(81) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Motivations. • Certains réseaux sont naturellement asymétriques (Twitter, réseaux routiers, graphes de dépendances, généalogies, . . . ) ; • Il faut donc pouvoir représenter des graphes avec des liens asymétriques ; • Ces graphes orientés contiennent des arcs (u, v ) au lieu d’arêtes {u, v } : la présence d’un lien dans un sens n’implique donc plus la présence de ce lien dans l’autre sens ; • On combinera plus tard poids et orientation ;. 81.
(82) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Concepts de base Définition 1 Un graphe orienté est un couple G = (V , A), où : • V est un ensemble de sommets ; • A ⊆ V × V un ensemble d’arcs ; On utilisera aussi les notations V (G ) et A(G ) pour bien distinguer le graphe G d’un autre graphe.. 82.
(83) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Concepts de base Définition 1. Exemple 4. Un graphe orienté est un couple G = (V , A), où :. 2. • V est un ensemble de sommets ; 1. • A ⊆ V × V un ensemble d’arcs ; On utilisera aussi les notations V (G ) et A(G ) pour bien distinguer le graphe G d’un autre graphe.. 3. 0 4. 83.
(84) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Concepts de base Définition 1. Exemple 4. Un graphe orienté est un couple G = (V , A), où :. 2. • V est un ensemble de sommets ; 1. • A ⊆ V × V un ensemble d’arcs ; On utilisera aussi les notations V (G ) et A(G ) pour bien distinguer le graphe G d’un autre graphe.. 3. 0 4. • Un arc (u, v ) relie une source à une destination ; on dit aussi que u est le prédécesseur de v , qui est le successeur de u ;.
(85) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Concepts de base Définition 1. Exemple 4. Un graphe orienté est un couple G = (V , A), où :. 2. • V est un ensemble de sommets ; 1. • A ⊆ V × V un ensemble d’arcs ; On utilisera aussi les notations V (G ) et A(G ) pour bien distinguer le graphe G d’un autre graphe.. 3. 0 4. • Un arc (u, v ) relie une source à une destination ; on dit aussi que u est le prédécesseur de v , qui est le successeur de u ; • Le voisinage d’un sommet v est l’union de ses prédécesseurs et de ses successseurs : NG (v ) = NG− (v ) ∪ NG+ (v ) = {u | (u, v ) ∈ A(G )} ∪ {w | (v , w ) ∈ A(G )}.
(86) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Concepts de base Définition 1. Exemple 4. Un graphe orienté est un couple G = (V , A), où :. 2. • V est un ensemble de sommets ; 1. • A ⊆ V × V un ensemble d’arcs ; On utilisera aussi les notations V (G ) et A(G ) pour bien distinguer le graphe G d’un autre graphe.. 3. 0 4. • Un arc (u, v ) relie une source à une destination ; on dit aussi que u est le prédécesseur de v , qui est le successeur de u ; • Le voisinage d’un sommet v est l’union de ses prédécesseurs et de ses successseurs : NG (v ) = NG− (v ) ∪ NG+ (v ) = {u | (u, v ) ∈ A(G )} ∪ {w | (v , w ) ∈ A(G )} − • Le degré entrant du sommet v est deg− G (v ) = |NG (v )| ;.
(87) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Concepts de base Définition 1. Exemple 4. Un graphe orienté est un couple G = (V , A), où :. 2. • V est un ensemble de sommets ; 1. • A ⊆ V × V un ensemble d’arcs ; On utilisera aussi les notations V (G ) et A(G ) pour bien distinguer le graphe G d’un autre graphe.. 3. 0 4. • Un arc (u, v ) relie une source à une destination ; on dit aussi que u est le prédécesseur de v , qui est le successeur de u ; • Le voisinage d’un sommet v est l’union de ses prédécesseurs et de ses successseurs : NG (v ) = NG− (v ) ∪ NG+ (v ) = {u | (u, v ) ∈ A(G )} ∪ {w | (v , w ) ∈ A(G )} − • Le degré entrant du sommet v est deg− G (v ) = |NG (v )| ; + + • Le degré sortant du sommet v est degG (v ) = |NG (v )| ;.
(88) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Adaptation des concepts non orientés Les définitions qu’on a utilisées jusqu’ici doivent également être adaptées pour prendre en compte l’orientation des arcs quand c’est nécessaire. Par exemple : • un chemin dans un graphe orienté G = (V , A) est une séquence de sommets distincts P = (u0 , u1 , u2 , . . . , up−1 ), où (ui , ui+1 ) ∈ A pour 0 ≤ i ≤ p − 2;.
(89) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Adaptation des concepts non orientés Les définitions qu’on a utilisées jusqu’ici doivent également être adaptées pour prendre en compte l’orientation des arcs quand c’est nécessaire. Par exemple : • un chemin dans un graphe orienté G = (V , A) est une séquence de sommets distincts P = (u0 , u1 , u2 , . . . , up−1 ), où (ui , ui+1 ) ∈ A pour 0 ≤ i ≤ p − 2; • un cycle dans un graphe orienté G = (V , A) est une séquence de sommets C = (u0 , u1 , u2 , . . ., up−1 ), où (ui , ui+1 mod p ) ∈ A pour 0 ≤ i ≤ p − 1.. 89.
(90) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Adaptation des concepts non orientés Les définitions qu’on a utilisées jusqu’ici doivent également être adaptées pour prendre en compte l’orientation des arcs quand c’est nécessaire. Par exemple : • un chemin dans un graphe orienté G = (V , A) est une séquence de sommets distincts P = (u0 , u1 , u2 , . . . , up−1 ), où (ui , ui+1 ) ∈ A pour 0 ≤ i ≤ p − 2; • un cycle dans un graphe orienté G = (V , A) est une séquence de sommets C = (u0 , u1 , u2 , . . ., up−1 ), où (ui , ui+1 mod p ) ∈ A pour 0 ≤ i ≤ p − 1.. Exemple 5. ceci n’est pas un chemin. ceci n’est pas un cycle. 90.
(91) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Adaptation des concepts non orientés Les définitions qu’on a utilisées jusqu’ici doivent également être adaptées pour prendre en compte l’orientation des arcs quand c’est nécessaire. Par exemple : • un chemin dans un graphe orienté G = (V , A) est une séquence de sommets distincts P = (u0 , u1 , u2 , . . . , up−1 ), où (ui , ui+1 ) ∈ A pour 0 ≤ i ≤ p − 2; • un cycle dans un graphe orienté G = (V , A) est une séquence de sommets C = (u0 , u1 , u2 , . . ., up−1 ), où (ui , ui+1 mod p ) ∈ A pour 0 ≤ i ≤ p − 1.. Exemple 5. ceci n’est pas un chemin. ceci n’est pas un cycle. • un descendant d’un sommet u dans un graphe orienté G est un sommet v 6= u tel qu’il existe un chemin (orienté) de u vers v dans G . 91.
(92) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Implémentation des graphes orientés • Les implémentations du cas non orienté s’adaptent facilement et se simplifient même :. • matrice d’adjacence : asymétrique, un seul ajout ; • listes d’adjacence : successeurs, un seul ajout ;. Exemple 6 0 1 2 3 4 0 1 1 1 1 2 1 3 1 1 4 1. 2. 1. 3. 0 4 ×. 0. 1. 1. 2. 4. 2. 3. ×. 3. 1. 4. 4. 3. ×. × ×. 92.
(93) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. L’API GrapheOrienté Les algorithmes étudiés supposeront l’existence d’une classe Graphe proposant les méthodes suivantes :. Méthode ajouter arc(u, v) ajouter arcs(séquence) ajouter sommet(sommet) ajouter sommets(séquence) arcs() boucles() contient arc(u, v) contient sommet(u) degre(sommet) degre entrant(sommet) degre sortant(sommet) nombre arcs() nombre boucles() nombre sommets(). Méthode predecesseurs(sommet) retirer arc(u, v) retirer arcs(séquence) retirer sommet(sommet) retirer sommets(séquence) sommets() sous graphe induit(séquence) successeurs(sommet) voisins(sommet). 93.
(94) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Parcours dans le cas orienté. • Dans le cas non-orienté, on était sûr d’atteindre tous les sommets du graphe accessibles à partir du sommet de départ ;. 94.
(95) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Parcours dans le cas orienté. • Dans le cas non-orienté, on était sûr d’atteindre tous les sommets du graphe accessibles à partir du sommet de départ ; • C’est aussi le cas dans le cas orienté, mais le fait que le graphe est “en un seul morceau” ne garantit plus qu’on puisse atteindre tous ses sommets !. 95.
(96) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Parcours dans le cas orienté. • Dans le cas non-orienté, on était sûr d’atteindre tous les sommets du graphe accessibles à partir du sommet de départ ; • C’est aussi le cas dans le cas orienté, mais le fait que le graphe est “en un seul morceau” ne garantit plus qu’on puisse atteindre tous ses sommets ! • La notion de composante connexe devra donc être adaptée, et la détection sera plus complexe ;. 96.
(97) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Parcours dans le cas orienté. • Dans le cas non-orienté, on était sûr d’atteindre tous les sommets du graphe accessibles à partir du sommet de départ ; • C’est aussi le cas dans le cas orienté, mais le fait que le graphe est “en un seul morceau” ne garantit plus qu’on puisse atteindre tous ses sommets ! • La notion de composante connexe devra donc être adaptée, et la détection sera plus complexe ; • Pour adapter les parcours en largeur et en profondeur : il suffit de remplacer les appels à G .voisins(v ) par G .successeurs(v ) ;. 97.
(98) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Détection de cycles orientés • Dans le cas non orienté, on détectait un cycle en vérifiant si un sommet accessible avait déjà un parent ;. Exemple 7 1. 2. 0. 98.
(99) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Détection de cycles orientés • Dans le cas non orienté, on détectait un cycle en vérifiant si un sommet accessible avait déjà un parent ; • Cela ne marche plus dans le cas orienté : un graphe orienté acyclique peut contenir plusieurs chemins de u à v ;. Exemple 7 1. 2. 0. 99.
(100) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Détection de cycles orientés. • Le parcours en profondeur permet la détection de cycles orientés, mais il faut l’adapter ;.
(101) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Détection de cycles orientés. • Le parcours en profondeur permet la détection de cycles orientés, mais il faut l’adapter ; • On doit pouvoir faire la différence entre un sommet :. 101.
(102) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Détection de cycles orientés. • Le parcours en profondeur permet la détection de cycles orientés, mais il faut l’adapter ; • On doit pouvoir faire la différence entre un sommet : 1. non exploré : on ne l’a jamais vu ;. 102.
(103) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Détection de cycles orientés. • Le parcours en profondeur permet la détection de cycles orientés, mais il faut l’adapter ; • On doit pouvoir faire la différence entre un sommet : 1 2. non exploré : on ne l’a jamais vu ; en cours de traitement : on est en train d’explorer ses descendants ;. 103.
(104) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Détection de cycles orientés. • Le parcours en profondeur permet la détection de cycles orientés, mais il faut l’adapter ; • On doit pouvoir faire la différence entre un sommet : 1 2. 3. non exploré : on ne l’a jamais vu ; en cours de traitement : on est en train d’explorer ses descendants ; exploré : on a exploré tous ses descendants ;. 104.
(105) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Détection de cycles orientés. • Le parcours en profondeur permet la détection de cycles orientés, mais il faut l’adapter ; • On doit pouvoir faire la différence entre un sommet : 1 2. 3. non exploré : on ne l’a jamais vu ; en cours de traitement : on est en train d’explorer ses descendants ; exploré : on a exploré tous ses descendants ;. • D’où le nom de “parcours tricolore” ;. 105.
(106) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Détection de cycles orientés. • En quoi ces couleurs aident-elles ?. 106.
(107) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Détection de cycles orientés. • En quoi ces couleurs aident-elles ? • Si en partant d’un sommet u, on tombe sur un sommet v exploré , on en conclut que plusieurs chemins de u à v existent ;. 107.
(108) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Détection de cycles orientés. • En quoi ces couleurs aident-elles ? • Si en partant d’un sommet u, on tombe sur un sommet v exploré , on en conclut que plusieurs chemins de u à v existent ; • Si en partant d’un sommet u, on tombe sur un sommet w en cours de traitement , alors on a un cycle ;. 108.
(109) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Détection de cycles orientés. Exemple 8 (parcours tricolore au départ de 0) 4. 3 0 2. 1. 109.
(110) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Détection de cycles orientés. Exemple 8 (parcours tricolore au départ de 0) 4. 3 0 2. 1. 110.
(111) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Détection de cycles orientés. Exemple 8 (parcours tricolore au départ de 0) 4. 3 0 2. 1. 111.
(112) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Détection de cycles orientés. Exemple 8 (parcours tricolore au départ de 0) 4. 3 0 2. 1. 112.
(113) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Détection de cycles orientés. Exemple 8 (parcours tricolore au départ de 0) 4. 3 0 2. 1. 113.
(114) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Détection de cycles orientés. Exemple 8 (parcours tricolore au départ de 0) 4. 3 0 2. 1. 114.
(115) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Détection de cycles orientés. Exemple 8 (parcours tricolore au départ de 0) 4. 3 0 2. 1. 115.
(116) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Détection de cycles orientés. Exemple 8 (parcours tricolore au départ de 0) 4. 3 0 2. 1. 116.
(117) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Détection de cycles orientés. Exemple 8 (parcours tricolore au départ de 0) 4. 3 0 2. 1. 117.
(118) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. L’algorithme de détection d’un cycle orienté Une légère adaptation du parcours en profondeur récursif nous permet d’arriver à nos fins :. Algorithme 3 : ContientCycleOrienté(G , sommet, statuts) Entrées : un graphe orienté G , un sommet de départ, et un tableau statuts de |V | cases. Sortie : vrai si un cycle de G est accessible à partir du sommet de départ, faux sinon. 1 2 3 4 5 6 7. si statuts[sommet] = “rouge” alors renvoyer vrai; si statuts[sommet] = “vert” alors renvoyer faux; statuts[sommet] ← “rouge”; pour chaque v ∈ G .successeurs(sommet) faire si ContientCycleOrienté(G , v , statuts) alors renvoyer vrai; statuts[sommet] ← “vert”; renvoyer faux;. 118.
(119) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Remarques sur la détection de cycles orientés. • Attention : un retour faux ne veut pas dire que G est acyclique, mais bien qu’aucun cycle n’est accessible au départ du sommet donné !. 119.
(120) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Remarques sur la détection de cycles orientés. • Attention : un retour faux ne veut pas dire que G est acyclique, mais bien qu’aucun cycle n’est accessible au départ du sommet donné ! • Faute de mieux, on relancera le parcours à partir de chaque sommet non encore exploré pour avoir la “vraie” réponse ;. 120.
(121) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Remarques sur la détection de cycles orientés. • Attention : un retour faux ne veut pas dire que G est acyclique, mais bien qu’aucun cycle n’est accessible au départ du sommet donné ! • Faute de mieux, on relancera le parcours à partir de chaque sommet non encore exploré pour avoir la “vraie” réponse ; • Pour reconstruire le cycle, on a besoin du tableau parents (cf. cas non orienté) ;. 121.
(122) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Motivation • Il est parfois utile d’enrichir la structure d’un graphe de manière à pouvoir répondre à certaines requêtes sur ce graphe plus rapidement ;.
(123) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Motivation • Il est parfois utile d’enrichir la structure d’un graphe de manière à pouvoir répondre à certaines requêtes sur ce graphe plus rapidement ; • Par exemple : calcul répété de tous les descendants d’un sommet ;. 123.
(124) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Motivation • Il est parfois utile d’enrichir la structure d’un graphe de manière à pouvoir répondre à certaines requêtes sur ce graphe plus rapidement ; • Par exemple : calcul répété de tous les descendants d’un sommet ;. Définition 2 La fermeture transitive d’un graphe orienté G = (V , A) est le graphe orienté G 0 = (V , A0 ) avec A0 = {(u, v ) | v ∈ descendants(u) dans G }.. 124.
(125) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Motivation • Il est parfois utile d’enrichir la structure d’un graphe de manière à pouvoir répondre à certaines requêtes sur ce graphe plus rapidement ; • Par exemple : calcul répété de tous les descendants d’un sommet ;. Définition 2 La fermeture transitive d’un graphe orienté G = (V , A) est le graphe orienté G 0 = (V , A0 ) avec A0 = {(u, v ) | v ∈ descendants(u) dans G }.. Exemple 9 3. 3 0. 2 G. 1. 0. 1. 2 fermeture transitive de G. 125.
(126) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Calcul de la fermeture transitive • Idée simple : rajouter un arc connectant chaque sommet à tous ses descendants ;.
(127) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Calcul de la fermeture transitive • Idée simple : rajouter un arc connectant chaque sommet à tous ses descendants ; • Les descendants se calculent avec un simple parcours ;.
(128) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Calcul de la fermeture transitive • Idée simple : rajouter un arc connectant chaque sommet à tous ses descendants ; • Les descendants se calculent avec un simple parcours ; Algorithme 4 :. FermetureTransitive(G ). Entrées : un graphe orienté connexe G . Sortie : la fermeture transitive de G . 1 2 3 4 5. F ← GrapheOrienté(G .sommets()); pour chaque u ∈ G .sommets() faire pour chaque v ∈ LargeurOrienté(F , u) faire si u 6= v alors F .ajouter arc(u, v ) ; renvoyer F ;.
(129) Plus courts chemins. Graphes orientés. Parcours. Détection de cycles. Fermeture transitive. Graphes orientés en dot. • Pour représenter un graphe orienté en dot, on utilise : • digraph au lieu de graph ; • -> pour les arcs (au lieu de -- pour les arêtes) ;. • On ne peut pas mélanger -- et -> : soit le graphe est orienté, soit il ne l’est pas ;. 129.
(130)
Documents relatifs
Introduction Les bases La m´ ethode de Ford-Fulkerson Coupes minimum Complexit´ e de l’algorithme
• Dans le cas o` u le graphe n’est pas biparti, le probl` eme reste soluble en temps polynomial mais l’algorithme est beaucoup plus complexe [2] ;. • Et si l’on veut des
3 combiner : combiner les solutions des sous-probl` emes pour obtenir la solution au probl` eme de d´ epart. • L’efficacit´ e de cette approche d´ epend fortement des complexit´ es
Introduction Principes Probl` eme de d´ ecoupe Distance d’´ edition Reconstruction des solutions optimales.. R´ esum´ e des ´ episodes pr´
et donc, le poids d’une solution optimale pour tsp est au moins celui d’un ACPM, qu’on est capable de trouver en temps polynomial ;.. Introduction vertex cover
Introduction Preuve du th´ eor` eme max-flow min-cut Algorithme de Dinitz Couplages dans un graphe biparti.. R´ esum´ e des ´ episodes pr´
I La m´ ethode de Ford-Fulkerson proc` ede comme suit ; on d´ emarre avec un flot f nul partout pour le r´ eseau G , et ` a chaque it´ eration :.. on augmente au maximum f sur les
I Chaque op´ eration d´ ecoupe un morceau en deux : A, qu’on ne d´ ecoupe plus, et B , qu’on d´ ecoupe de mani` ere optimale ; I Pour reconstruire la d´ ecoupe optimale, on stocke