Arbre couvrant minimal d’un graphe (suite) Algorithme de Prim-Jarník Algorithme similaire à l”algorithme de Dijkstra (dans le cas des graphes connexes) On choisit un sommet s aléatoirement qu’on met dans un “nuage” et on construit l’arbre couvrant minimal en faisant grossir le “nuage” d’un sommet à la fois. On garde en mémoire à chaque sommet v, une étiquette d(v) qui ici est égale au poids minimal parmi les poids des arêtes reliant v à un sommet à l’intérieur du nuage. À chaque étape: On ajoute au nuage le sommet u extérieur ayant la plus petite étiquette d(u) On met à jour les étiquettes des sommets adjacents à u IFT2010, H2004, Sylvie Hamel Université de Montréal ACM, suite et fin! 1 Exemple: 2 ∞ B 8 ∞ 5 2 D 7 F 8 7 2 D 2 5 8 A 4 9 F 8 IFT2010, H2004, Sylvie Hamel Université de Montréal F 8 ∞ 2 7 0 ACM, suite et fin! 4 9 5 C 5 7 7 B F 8 8 A D 7 ∞4 3 E 7 ∞ 3 E A 3 E 4 9 5 C 5 2 7 B 8 ∞7 B D 7 2 0 7 8 5 C ∞ 3 E ∞7 8 0 2 4 9 C A ∞ 7 2 Exemple (suite) 2 2 7 7 B 4 9 5 C 5 F 8 8 A D 4 3 E 7 37 2 2 7 IFT2010, H2004, Sylvie Hamel Université de Montréal 7 B A ACM, suite et fin! 4 9 5 C 5 F 8 8 0 D 3 E 7 4 3 3 Analyse de la complexité en temps Opérations sur les graphes: On appelle l’opération Incidentes(v) une fois pour chaque sommet v. Donc, temps total si on utilise une liste d’adjacence de O(m) Étiquettage: On peut changer l’étiquette D(u) d’un sommet u jusqu’à O(deg(u)) fois. Donc, au total, l’étiquettage prend un temps O(m) Opérations de liste avec priorités Chaque sommet est inséré une fois dans la liste et retiré une fois. Chaque insertion et suppresion prend un temps O(log n). Total O(n log n) La clé de chaque sommet u est modifiée au plus O(deg(u)) et prend un temps O(log n) chaque fois. Total O(m log n) La complexité en temps de Prim-Jarník est donc de O((n+m) log n) ou O(m log n) si le graphe est simple et connexe IFT2010, H2004, Sylvie Hamel Université de Montréal ACM, suite et fin! 4 Retour au chemin de poids minimal entre deux sommets L’algorithme de Dijkstra nous permet de trouver, étant donné une source, les chemins de poids minimal entre cette source et tous les autres sommet du graphe. Fonctionne seulement avec des arêtes de poids nonnégatifs en O((n+m) log n) L’algorithme de Bellman-Ford nous permet de trouver, étant donné une source, les chemins de poids minimal entre cette source et tous les autres sommet du graphe. Fonctionne avec des arêtes de poids négatifs en O(nm) Ne trouve pas de solution si le graphe à un cycle de poids total négatif Pourquoi?? IFT2010, H2004, Sylvie Hamel Université de Montréal ACM, suite et fin! 5 Exemple d’exécution 0 4 1 0 -2 1 ∞ 2 3 -2 9 1 -2 2 5 4 4 1 ∞ 4 3 -1 9 ∞ 5 4 Deuxième étape ∞ 4 Première étape Dernière étape 0 4 1 0 -2 1 ∞ 2 -2 3 9 4 ∞ 4 1 5 ∞ 4 -2 1 -2 2 3 -1 9 4 4 5