Algorithmique des graphes 5 — Graphes orient´es, la suite Anthony Labarre 3 mars 2021
Texte intégral
(2) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Récapitulatif Jusqu’ici, on a vu : • des graphes non orientés, et :. 2.
(3) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Récapitulatif Jusqu’ici, on a vu : • des graphes non orientés, et :. • les parcours (largeur, profondeur) et les arbres associés ;. 3.
(4) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Récapitulatif Jusqu’ici, on a vu : • des graphes non orientés, et :. • les parcours (largeur, profondeur) et les arbres associés ; • le calcul des composantes connexes ;. 4.
(5) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Récapitulatif Jusqu’ici, on a vu : • des graphes non orientés, et :. • les parcours (largeur, profondeur) et les arbres associés ; • le calcul des composantes connexes ; • la détection de cycle ;. 5.
(6) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Récapitulatif Jusqu’ici, on a vu : • des graphes non orientés, et :. • • • •. les parcours (largeur, profondeur) et les arbres associés ; le calcul des composantes connexes ; la détection de cycle ; la reconnaissance des graphes bipartis ;. 6.
(7) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Récapitulatif Jusqu’ici, on a vu : • des graphes non orientés, et :. • • • •. les parcours (largeur, profondeur) et les arbres associés ; le calcul des composantes connexes ; la détection de cycle ; la reconnaissance des graphes bipartis ;. • des graphes pondérés, et :. 7.
(8) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Récapitulatif Jusqu’ici, on a vu : • des graphes non orientés, et :. • • • •. les parcours (largeur, profondeur) et les arbres associés ; le calcul des composantes connexes ; la détection de cycle ; la reconnaissance des graphes bipartis ;. • des graphes pondérés, et :. • le calcul d’ACPM et FCPM ;. 8.
(9) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Récapitulatif Jusqu’ici, on a vu : • des graphes non orientés, et :. • • • •. les parcours (largeur, profondeur) et les arbres associés ; le calcul des composantes connexes ; la détection de cycle ; la reconnaissance des graphes bipartis ;. • des graphes pondérés, et :. • le calcul d’ACPM et FCPM ; • le calcul de plus courts chemins (pour les poids ≥ 0) ;. 9.
(10) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Récapitulatif Jusqu’ici, on a vu : • des graphes non orientés, et :. • • • •. les parcours (largeur, profondeur) et les arbres associés ; le calcul des composantes connexes ; la détection de cycle ; la reconnaissance des graphes bipartis ;. • des graphes pondérés, et :. • le calcul d’ACPM et FCPM ; • le calcul de plus courts chemins (pour les poids ≥ 0) ; • des graphes orientés, et :. 10.
(11) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Récapitulatif Jusqu’ici, on a vu : • des graphes non orientés, et :. • • • •. les parcours (largeur, profondeur) et les arbres associés ; le calcul des composantes connexes ; la détection de cycle ; la reconnaissance des graphes bipartis ;. • des graphes pondérés, et :. • le calcul d’ACPM et FCPM ; • le calcul de plus courts chemins (pour les poids ≥ 0) ; • des graphes orientés, et :. • les parcours (largeur, profondeur) et les arbres associés ;. 11.
(12) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Récapitulatif Jusqu’ici, on a vu : • des graphes non orientés, et :. • • • •. les parcours (largeur, profondeur) et les arbres associés ; le calcul des composantes connexes ; la détection de cycle ; la reconnaissance des graphes bipartis ;. • des graphes pondérés, et :. • le calcul d’ACPM et FCPM ; • le calcul de plus courts chemins (pour les poids ≥ 0) ; • des graphes orientés, et :. • les parcours (largeur, profondeur) et les arbres associés ; • la détection de cycle ;. 12.
(13) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Récapitulatif Jusqu’ici, on a vu : • des graphes non orientés, et :. • • • •. les parcours (largeur, profondeur) et les arbres associés ; le calcul des composantes connexes ; la détection de cycle ; la reconnaissance des graphes bipartis ;. • des graphes pondérés, et :. • le calcul d’ACPM et FCPM ; • le calcul de plus courts chemins (pour les poids ≥ 0) ; • des graphes orientés, et :. • les parcours (largeur, profondeur) et les arbres associés ; • la détection de cycle ; • le calcul de fermeture transitive ;. 13.
(14) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Correction de l’algorithme de Dijkstra. • On a vu la fois passée l’algorithme de Dijkstra, qui construit les plus courts chemins d’un sommet donné vers les autres sommets du graphe ; • Prouvons aujourd’hui que cet algorithme fonctionne (reprenez le pseudocode !) ;. 14.
(15) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Correction de l’algorithme de Dijkstra Soit T l’ensemble des sommets déjà traités, et : • δ(a, b) = la distance réelle entre a et b ; • ε(a, b) = la distance estimée (par l’algorithme) entre a et b ;. 15.
(16) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Correction de l’algorithme de Dijkstra Soit T l’ensemble des sommets déjà traités, et : • δ(a, b) = la distance réelle entre a et b ; • ε(a, b) = la distance estimée (par l’algorithme) entre a et b ; Montrons par induction sur |T | que les estimations sont correctes.. 16.
(17) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Correction de l’algorithme de Dijkstra Soit T l’ensemble des sommets déjà traités, et : • δ(a, b) = la distance réelle entre a et b ; • ε(a, b) = la distance estimée (par l’algorithme) entre a et b ; Montrons par induction sur |T | que les estimations sont correctes. 1 cas de base : T = {s}, et ε(s, s) = 0 = δ(s, s) ;. 17.
(18) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Correction de l’algorithme de Dijkstra Soit T l’ensemble des sommets déjà traités, et : • δ(a, b) = la distance réelle entre a et b ; • ε(a, b) = la distance estimée (par l’algorithme) entre a et b ; Montrons par induction sur |T | que les estimations sont correctes. 1 cas de base : T = {s}, et ε(s, s) = 0 = δ(s, s) ; 2 induction :.
(19) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Correction de l’algorithme de Dijkstra Soit T l’ensemble des sommets déjà traités, et : • δ(a, b) = la distance réelle entre a et b ; • ε(a, b) = la distance estimée (par l’algorithme) entre a et b ; Montrons par induction sur |T | que les estimations sont correctes. 1 cas de base : T = {s}, et ε(s, s) = 0 = δ(s, s) ; 2 induction :. • hypothèse d’induction (HI) :.
(20) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Correction de l’algorithme de Dijkstra Soit T l’ensemble des sommets déjà traités, et : • δ(a, b) = la distance réelle entre a et b ; • ε(a, b) = la distance estimée (par l’algorithme) entre a et b ; Montrons par induction sur |T | que les estimations sont correctes. 1 cas de base : T = {s}, et ε(s, s) = 0 = δ(s, s) ; 2 induction :. • hypothèse d’induction (HI) : ε(s, v ) ≤ δ(s, v ) ∀ v ∈ T ..
(21) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Correction de l’algorithme de Dijkstra Soit T l’ensemble des sommets déjà traités, et : • δ(a, b) = la distance réelle entre a et b ; • ε(a, b) = la distance estimée (par l’algorithme) entre a et b ; Montrons par induction sur |T | que les estimations sont correctes. 1 cas de base : T = {s}, et ε(s, s) = 0 = δ(s, s) ; 2 induction :. • hypothèse d’induction (HI) : ε(s, v ) ≤ δ(s, v ) ∀ v ∈ T . • à prouver : ε(s, t) ≤ δ(s, t) (t est le prochain sommet à traiter) ;. T s. t.
(22) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Correction de l’algorithme de Dijkstra Soit T l’ensemble des sommets déjà traités, et : • δ(a, b) = la distance réelle entre a et b ; • ε(a, b) = la distance estimée (par l’algorithme) entre a et b ; Montrons par induction sur |T | que les estimations sont correctes. 1 cas de base : T = {s}, et ε(s, s) = 0 = δ(s, s) ; 2 induction :. • hypothèse d’induction (HI) : ε(s, v ) ≤ δ(s, v ) ∀ v ∈ T . • à prouver : ε(s, t) ≤ δ(s, t) (t est le prochain sommet à traiter) ;. T s. x. y. t P.
(23) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Correction de l’algorithme de Dijkstra Soit T l’ensemble des sommets déjà traités, et : • δ(a, b) = la distance réelle entre a et b ; • ε(a, b) = la distance estimée (par l’algorithme) entre a et b ; Montrons par induction sur |T | que les estimations sont correctes. 1 cas de base : T = {s}, et ε(s, s) = 0 = δ(s, s) ; 2 induction :. • hypothèse d’induction (HI) : ε(s, v ) ≤ δ(s, v ) ∀ v ∈ T . • à prouver : ε(s, t) ≤ δ(s, t) (t est le prochain sommet à traiter) ; δ(s, t) ≥ δ(s, y ). T s. x. y. t P.
(24) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Correction de l’algorithme de Dijkstra Soit T l’ensemble des sommets déjà traités, et : • δ(a, b) = la distance réelle entre a et b ; • ε(a, b) = la distance estimée (par l’algorithme) entre a et b ; Montrons par induction sur |T | que les estimations sont correctes. 1 cas de base : T = {s}, et ε(s, s) = 0 = δ(s, s) ; 2 induction :. • hypothèse d’induction (HI) : ε(s, v ) ≤ δ(s, v ) ∀ v ∈ T . • à prouver : ε(s, t) ≤ δ(s, t) (t est le prochain sommet à traiter) ; δ(s, t) ≥ δ(s, y ). T s. x. y. = δ(s, x) + w ({x, y }). t P.
(25) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Correction de l’algorithme de Dijkstra Soit T l’ensemble des sommets déjà traités, et : • δ(a, b) = la distance réelle entre a et b ; • ε(a, b) = la distance estimée (par l’algorithme) entre a et b ; Montrons par induction sur |T | que les estimations sont correctes. 1 cas de base : T = {s}, et ε(s, s) = 0 = δ(s, s) ; 2 induction :. • hypothèse d’induction (HI) : ε(s, v ) ≤ δ(s, v ) ∀ v ∈ T . • à prouver : ε(s, t) ≤ δ(s, t) (t est le prochain sommet à traiter) ; δ(s, t) ≥ δ(s, y ). T s. x. y. = δ(s, x) + w ({x, y }). t. ≥ ε(s, x) + w ({x, y }) P.
(26) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Correction de l’algorithme de Dijkstra Soit T l’ensemble des sommets déjà traités, et : • δ(a, b) = la distance réelle entre a et b ; • ε(a, b) = la distance estimée (par l’algorithme) entre a et b ; Montrons par induction sur |T | que les estimations sont correctes. 1 cas de base : T = {s}, et ε(s, s) = 0 = δ(s, s) ; 2 induction :. • hypothèse d’induction (HI) : ε(s, v ) ≤ δ(s, v ) ∀ v ∈ T . • à prouver : ε(s, t) ≤ δ(s, t) (t est le prochain sommet à traiter) ; δ(s, t) ≥ δ(s, y ). T s. x. y. = δ(s, x) + w ({x, y }). t. ≥ ε(s, x) + w ({x, y }) P. ≥ ε(s, y ).
(27) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Correction de l’algorithme de Dijkstra Soit T l’ensemble des sommets déjà traités, et : • δ(a, b) = la distance réelle entre a et b ; • ε(a, b) = la distance estimée (par l’algorithme) entre a et b ; Montrons par induction sur |T | que les estimations sont correctes. 1 cas de base : T = {s}, et ε(s, s) = 0 = δ(s, s) ; 2 induction :. • hypothèse d’induction (HI) : ε(s, v ) ≤ δ(s, v ) ∀ v ∈ T . • à prouver : ε(s, t) ≤ δ(s, t) (t est le prochain sommet à traiter) ; δ(s, t) ≥ δ(s, y ). T s. x. y. = δ(s, x) + w ({x, y }). t. ≥ ε(s, x) + w ({x, y }) P. ≥ ε(s, y ) ≥ ε(s, t)..
(28) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Connexité dans les graphes orientés Définition 1 Une composante fortement connexe H d’un graphe orienté G est un ensemble maximal de sommets dont toute paire est reliée par un chemin orienté.. 28.
(29) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Connexité dans les graphes orientés Définition 1 Une composante fortement connexe H d’un graphe orienté G est un ensemble maximal de sommets dont toute paire est reliée par un chemin orienté. H est faiblement connexe s’il s’agit d’une composante connexe de la version non-orientée de G , mais pas d’une composante fortement connexe de G ..
(30) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Connexité dans les graphes orientés Définition 1 Une composante fortement connexe H d’un graphe orienté G est un ensemble maximal de sommets dont toute paire est reliée par un chemin orienté. H est faiblement connexe s’il s’agit d’une composante connexe de la version non-orientée de G , mais pas d’une composante fortement connexe de G . À cause de l’orientation, il n’est donc plus correct de dire qu’un graphe orienté fortement connexe est forcément “en un seul morceau”..
(31) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Connexité dans les graphes orientés Définition 1 Une composante fortement connexe H d’un graphe orienté G est un ensemble maximal de sommets dont toute paire est reliée par un chemin orienté. H est faiblement connexe s’il s’agit d’une composante connexe de la version non-orientée de G , mais pas d’une composante fortement connexe de G . À cause de l’orientation, il n’est donc plus correct de dire qu’un graphe orienté fortement connexe est forcément “en un seul morceau”.. Exemple 1 4 3. 0. 1 2.
(32) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Identification des CFC • Sur base des algorithmes déjà vus, comment faire pour identifier les CFC ?. 32.
(33) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Identification des CFC • Sur base des algorithmes déjà vus, comment faire pour identifier les CFC ? • On pourrait :. 33.
(34) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Identification des CFC • Sur base des algorithmes déjà vus, comment faire pour identifier les CFC ? • On pourrait : 1. calculer les descendants de chaque sommet par un simple parcours ;. 34.
(35) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Identification des CFC • Sur base des algorithmes déjà vus, comment faire pour identifier les CFC ? • On pourrait : 1. calculer les descendants de chaque sommet par un simple parcours ;. 2. regrouper les paires de sommets mutuellement accessibles (donc dans les deux sens) ;.
(36) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Identification des CFC • Sur base des algorithmes déjà vus, comment faire pour identifier les CFC ? • On pourrait : 1. calculer les descendants de chaque sommet par un simple parcours ;. 2. regrouper les paires de sommets mutuellement accessibles (donc dans les deux sens) ;. • Ça fonctionne, mais c’est lent : on doit faire |V | parcours ;. 36.
(37) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Identification des CFC • Sur base des algorithmes déjà vus, comment faire pour identifier les CFC ? • On pourrait : 1. calculer les descendants de chaque sommet par un simple parcours ;. 2. regrouper les paires de sommets mutuellement accessibles (donc dans les deux sens) ;. • Ça fonctionne, mais c’est lent : on doit faire |V | parcours ; • L’algorithme de Kosaraju-Sharir qu’on va voir le fait en deux parcours ;. 37.
(38) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Parcours en profondeur “daté” • La première étape consiste à parcourir le graphe en profondeur ;. 38.
(39) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Parcours en profondeur “daté” • La première étape consiste à parcourir le graphe en profondeur ; • Lors de ce parcours, on va “dater” les sommets en fonction du moment où leur exploration se termine ;. 39.
(40) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Parcours en profondeur “daté” • La première étape consiste à parcourir le graphe en profondeur ; • Lors de ce parcours, on va “dater” les sommets en fonction du moment où leur exploration se termine ; • À la fin du parcours, tous les sommets seront donc numérotés ;. 40.
(41) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Parcours en profondeur “daté” • La première étape consiste à parcourir le graphe en profondeur ; • Lors de ce parcours, on va “dater” les sommets en fonction du moment où leur exploration se termine ; • À la fin du parcours, tous les sommets seront donc numérotés ;. Exemple 2 4 0. 5 6. 1 2. 7 3 41.
(42) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Parcours en profondeur “daté” • La première étape consiste à parcourir le graphe en profondeur ; • Lors de ce parcours, on va “dater” les sommets en fonction du moment où leur exploration se termine ; • À la fin du parcours, tous les sommets seront donc numérotés ;. Exemple 2 4 0. 5 6. 1 2. 7 3 42.
(43) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Parcours en profondeur “daté” • La première étape consiste à parcourir le graphe en profondeur ; • Lors de ce parcours, on va “dater” les sommets en fonction du moment où leur exploration se termine ; • À la fin du parcours, tous les sommets seront donc numérotés ;. Exemple 2 4 0. 5 6. 1 2. 7 3 43.
(44) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Parcours en profondeur “daté” • La première étape consiste à parcourir le graphe en profondeur ; • Lors de ce parcours, on va “dater” les sommets en fonction du moment où leur exploration se termine ; • À la fin du parcours, tous les sommets seront donc numérotés ;. Exemple 2 4 0. 5 6. 1 2. 7 3 44.
(45) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Parcours en profondeur “daté” • La première étape consiste à parcourir le graphe en profondeur ; • Lors de ce parcours, on va “dater” les sommets en fonction du moment où leur exploration se termine ; • À la fin du parcours, tous les sommets seront donc numérotés ;. Exemple 2 4 0. 5 6. 1 2. 7 3 45.
(46) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Parcours en profondeur “daté” • La première étape consiste à parcourir le graphe en profondeur ; • Lors de ce parcours, on va “dater” les sommets en fonction du moment où leur exploration se termine ; • À la fin du parcours, tous les sommets seront donc numérotés ;. Exemple 2 4 0. 5 6. 1 2. 7 3 46.
(47) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Parcours en profondeur “daté” • La première étape consiste à parcourir le graphe en profondeur ; • Lors de ce parcours, on va “dater” les sommets en fonction du moment où leur exploration se termine ; • À la fin du parcours, tous les sommets seront donc numérotés ;. Exemple 2 4 0. 5 6. 1 2. 7. 0. 3 47.
(48) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Parcours en profondeur “daté” • La première étape consiste à parcourir le graphe en profondeur ; • Lors de ce parcours, on va “dater” les sommets en fonction du moment où leur exploration se termine ; • À la fin du parcours, tous les sommets seront donc numérotés ;. Exemple 2 4 0. 5 6. 1 2. 7 3. 0. 1 48.
(49) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Parcours en profondeur “daté” • La première étape consiste à parcourir le graphe en profondeur ; • Lors de ce parcours, on va “dater” les sommets en fonction du moment où leur exploration se termine ; • À la fin du parcours, tous les sommets seront donc numérotés ;. Exemple 2 4 0. 5 6. 1 2. 7 3. 0. 1 49.
(50) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Parcours en profondeur “daté” • La première étape consiste à parcourir le graphe en profondeur ; • Lors de ce parcours, on va “dater” les sommets en fonction du moment où leur exploration se termine ; • À la fin du parcours, tous les sommets seront donc numérotés ;. Exemple 2 4 0. 5 6. 1 2. 7 3. 0. 1 50.
(51) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Parcours en profondeur “daté” • La première étape consiste à parcourir le graphe en profondeur ; • Lors de ce parcours, on va “dater” les sommets en fonction du moment où leur exploration se termine ; • À la fin du parcours, tous les sommets seront donc numérotés ;. Exemple 2 2 4 0. 5 6. 1 2. 7 3. 0. 1 51.
(52) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Parcours en profondeur “daté” • La première étape consiste à parcourir le graphe en profondeur ; • Lors de ce parcours, on va “dater” les sommets en fonction du moment où leur exploration se termine ; • À la fin du parcours, tous les sommets seront donc numérotés ;. Exemple 2 2 4 0. 5 6. 1. 3. 2. 7 3. 0. 1 52.
(53) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Parcours en profondeur “daté” • La première étape consiste à parcourir le graphe en profondeur ; • Lors de ce parcours, on va “dater” les sommets en fonction du moment où leur exploration se termine ; • À la fin du parcours, tous les sommets seront donc numérotés ;. Exemple 2 2 4 0. 5 6. 1. 3. 2 4. 7 3. 0. 1 53.
(54) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Parcours en profondeur “daté” • La première étape consiste à parcourir le graphe en profondeur ; • Lors de ce parcours, on va “dater” les sommets en fonction du moment où leur exploration se termine ; • À la fin du parcours, tous les sommets seront donc numérotés ;. Exemple 2 2 4 0. 5 6. 1. 3. 2 4. 7 3. 0. 1 54.
(55) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Parcours en profondeur “daté” • La première étape consiste à parcourir le graphe en profondeur ; • Lors de ce parcours, on va “dater” les sommets en fonction du moment où leur exploration se termine ; • À la fin du parcours, tous les sommets seront donc numérotés ;. Exemple 2. 0. 5. 2. 4. 5 6. 1. 3. 2 4. 7 3. 0. 1 55.
(56) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Parcours en profondeur “daté” • La première étape consiste à parcourir le graphe en profondeur ; • Lors de ce parcours, on va “dater” les sommets en fonction du moment où leur exploration se termine ; • À la fin du parcours, tous les sommets seront donc numérotés ;. Exemple 2. 0. 5. 2. 4. 5 6. 1 6. 3. 2 4. 7 3. 0. 1 56.
(57) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Parcours en profondeur “daté” • La première étape consiste à parcourir le graphe en profondeur ; • Lors de ce parcours, on va “dater” les sommets en fonction du moment où leur exploration se termine ; • À la fin du parcours, tous les sommets seront donc numérotés ;. Exemple 2. 7. 0. 5. 2. 4. 5 6. 1 6. 3. 2 4. 7 3. 0. 1 57.
(58) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. L’algorithme du parcours en profondeur daté L’algorithme suivant doit être lancé sur tous les sommets du graphe (par exemple par un algorithme auxiliaire ProfondeurDatesAux) : Algorithme 1 :. ProfondeurDates(G , départ, dates, instant). Entrées : un graphe orienté G , un sommet de départ, un tableau de dates, et un instant. Résultat : dates contient les dates de fin de visite des sommets de G accessibles à partir du sommet de départ dans l’ordre où le parcours en profondeur les a découverts. 1 2 3 4 5. dates[départ] ← 0 ; // marquer le début de l’exploration; pour chaque v ∈ G .successeurs(départ) faire si dates[v ] = nil alors ProfondeurDates(G , v , dates, instant) ; dates[départ] ← instant ; // marquer la fin de l’exploration; instant ← instant + 1;. 58.
(59) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Parcours renversé • La deuxième étape de l’algorithme consiste à effectuer un parcours sur le graphe “renversé” ; c’est-à-dire le graphe G 0 tel que (u, v ) ∈ A(G ) ⇔ (v , u) ∈ A(G 0 ) ;. 59.
(60) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Parcours renversé • La deuxième étape de l’algorithme consiste à effectuer un parcours sur le graphe “renversé” ; c’est-à-dire le graphe G 0 tel que (u, v ) ∈ A(G ) ⇔ (v , u) ∈ A(G 0 ) ; • Ce parcours s’effectue par date de fin décroissante ;.
(61) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Parcours renversé • La deuxième étape de l’algorithme consiste à effectuer un parcours sur le graphe “renversé” ; c’est-à-dire le graphe G 0 tel que (u, v ) ∈ A(G ) ⇔ (v , u) ∈ A(G 0 ) ; • Ce parcours s’effectue par date de fin décroissante ;. Exemple 3 5 4. 5 4. 2 5. 7 0. 7 0. 6 3. 1 6 2 4. 6 3. 1 6 7 0. 3 1. 2 5. 2 4. 7 0 3 1. 61.
(62) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Parcours renversé • La deuxième étape de l’algorithme consiste à effectuer un parcours sur le graphe “renversé” ; c’est-à-dire le graphe G 0 tel que (u, v ) ∈ A(G ) ⇔ (v , u) ∈ A(G 0 ) ; • Ce parcours s’effectue par date de fin décroissante ;. Exemple 3 5 4. 5 4. 2 5. 7 0. 7 0. 6 3. 1 6 2 4. 6 3. 1 6 7 0. 3 1. 2 5. 2 4. 7 0 3 1. 62.
(63) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Parcours renversé • La deuxième étape de l’algorithme consiste à effectuer un parcours sur le graphe “renversé” ; c’est-à-dire le graphe G 0 tel que (u, v ) ∈ A(G ) ⇔ (v , u) ∈ A(G 0 ) ; • Ce parcours s’effectue par date de fin décroissante ;. Exemple 3 5 4. 5 4. 2 5. 7 0. 7 0. 6 3. 1 6 2 4. 6 3. 1 6 7 0. 3 1. 2 5. 2 4. 7 0 3 1. 63.
(64) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Parcours renversé • La deuxième étape de l’algorithme consiste à effectuer un parcours sur le graphe “renversé” ; c’est-à-dire le graphe G 0 tel que (u, v ) ∈ A(G ) ⇔ (v , u) ∈ A(G 0 ) ; • Ce parcours s’effectue par date de fin décroissante ;. Exemple 3 5 4. 5 4. 2 5. 7 0. 7 0. 6 3. 1 6 2 4. 6 3. 1 6 7 0. 3 1. 2 5. 2 4. 7 0 3 1. 64.
(65) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Parcours renversé • La deuxième étape de l’algorithme consiste à effectuer un parcours sur le graphe “renversé” ; c’est-à-dire le graphe G 0 tel que (u, v ) ∈ A(G ) ⇔ (v , u) ∈ A(G 0 ) ; • Ce parcours s’effectue par date de fin décroissante ;. Exemple 3 5 4. 5 4. 2 5. 7 0. 7 0. 6 3. 1 6 2 4. 6 3. 1 6 7 0. 3 1. 2 5. 2 4. 7 0 3 1. 65.
(66) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Parcours renversé • La deuxième étape de l’algorithme consiste à effectuer un parcours sur le graphe “renversé” ; c’est-à-dire le graphe G 0 tel que (u, v ) ∈ A(G ) ⇔ (v , u) ∈ A(G 0 ) ; • Ce parcours s’effectue par date de fin décroissante ;. Exemple 3 5 4. 5 4. 2 5. 7 0. 7 0. 6 3. 1 6 2 4. 6 3. 1 6 7 0. 3 1. 2 5. 2 4. 7 0 3 1. 66.
(67) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Parcours renversé • La deuxième étape de l’algorithme consiste à effectuer un parcours sur le graphe “renversé” ; c’est-à-dire le graphe G 0 tel que (u, v ) ∈ A(G ) ⇔ (v , u) ∈ A(G 0 ) ; • Ce parcours s’effectue par date de fin décroissante ;. Exemple 3 5 4. 5 4. 2 5. 7 0. 7 0. 6 3. 1 6 2 4. 6 3. 1 6 7 0. 3 1. 2 5. 2 4. 7 0 3 1. 67.
(68) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Parcours renversé • La deuxième étape de l’algorithme consiste à effectuer un parcours sur le graphe “renversé” ; c’est-à-dire le graphe G 0 tel que (u, v ) ∈ A(G ) ⇔ (v , u) ∈ A(G 0 ) ; • Ce parcours s’effectue par date de fin décroissante ;. Exemple 3 5 4. 5 4. 2 5. 7 0. 7 0. 6 3. 1 6 2 4. 6 3. 1 6 7 0. 3 1. 2 5. 2 4. 7 0 3 1. 68.
(69) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Parcours renversé • La deuxième étape de l’algorithme consiste à effectuer un parcours sur le graphe “renversé” ; c’est-à-dire le graphe G 0 tel que (u, v ) ∈ A(G ) ⇔ (v , u) ∈ A(G 0 ) ; • Ce parcours s’effectue par date de fin décroissante ;. Exemple 3 5 4. 5 4. 2 5. 7 0. 7 0. 6 3. 1 6 2 4. 6 3. 1 6 7 0. 3 1. 2 5. 2 4. 7 0 3 1. 69.
(70) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Parcours renversé • La deuxième étape de l’algorithme consiste à effectuer un parcours sur le graphe “renversé” ; c’est-à-dire le graphe G 0 tel que (u, v ) ∈ A(G ) ⇔ (v , u) ∈ A(G 0 ) ; • Ce parcours s’effectue par date de fin décroissante ;. Exemple 3 5 4. 5 4. 2 5. 7 0. 7 0. 6 3. 1 6 2 4. 6 3. 1 6 7 0. 3 1. 2 5. 2 4. 7 0 3 1. . . . et c’est fini ! 70.
(71) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. L’algorithme de Kosaraju-Sharir proprement dit. Algorithme 2 :. KosarajuSharir(G ). Entrées : un graphe orienté G . Sortie : les composantes fortement connexes de G . 1 2 3 4 5. 6 7 8. CFC ← liste(); dates ← ProfondeurDatesAux(G ); G 0 ← renverser arcs(G ); visités ← tableau(G .nombre sommets(), faux); pour chaque v ∈ renverser(trier sommets par date(G 0 .sommets(), dates)) faire si ¬ visités[v ] alors CFC.ajouter en fin(ProfondeurOrienté(G 0 , v , visités)); renvoyer CFC;. 71.
(72) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Complexité • La complexité de l’algorithme de Kosaraju-Sharir se calcule aisément :.
(73) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Complexité • La complexité de l’algorithme de Kosaraju-Sharir se calcule aisément : 1. parcours daté : O(|V | + |A|) ;.
(74) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Complexité • La complexité de l’algorithme de Kosaraju-Sharir se calcule aisément : 1. parcours daté : O(|V | + |A|) ;. 2. renversement : O(|V | + |A|) ;.
(75) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Complexité • La complexité de l’algorithme de Kosaraju-Sharir se calcule aisément : 1. parcours daté : O(|V | + |A|) ;. 2. renversement : O(|V | + |A|) ;. 3. tri : O(|V | log |V |) ;.
(76) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Complexité • La complexité de l’algorithme de Kosaraju-Sharir se calcule aisément : 1. parcours daté : O(|V | + |A|) ;. 2. renversement : O(|V | + |A|) ;. 3. tri : O(|V | log |V |) ;. 4. parcours de G 0 : O(|V | + |A0 |) = O(|V | + |A|) ;.
(77) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Complexité • La complexité de l’algorithme de Kosaraju-Sharir se calcule aisément : 1. parcours daté : O(|V | + |A|) ;. 2. renversement : O(|V | + |A|) ;. 3. tri : O(|V | log |V |) ;. 4. parcours de G 0 : O(|V | + |A0 |) = O(|V | + |A|) ;. • ⇒ total : O(|V | log |V | + |A|) ;.
(78) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Complexité • La complexité de l’algorithme de Kosaraju-Sharir se calcule aisément : 1. parcours daté : O(|V | + |A|) ;. 2. renversement : O(|V | + |A|) ;. 3. tri : O(|V | log |V |) ;. 4. parcours de G 0 : O(|V | + |A0 |) = O(|V | + |A|) ;. • ⇒ total : O(|V | log |V | + |A|) ; • Peut-on faire mieux ?.
(79) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Complexité • La complexité de l’algorithme de Kosaraju-Sharir se calcule aisément : 1. parcours daté : O(|V | + |A|) ;. 2. renversement : O(|V | + |A|) ;. 3. tri : O(|V | log |V |) ;. 4. parcours de G 0 : O(|V | + |A0 |) = O(|V | + |A|) ;. • ⇒ total : O(|V | log |V | + |A|) ; • Peut-on faire mieux ? 1. si le premier parcours empile les sommets au lieu de les numéroter, pas besoin de tri ⇒ O(|V | + |A|) ;. 79.
(80) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Complexité • La complexité de l’algorithme de Kosaraju-Sharir se calcule aisément : 1. parcours daté : O(|V | + |A|) ;. 2. renversement : O(|V | + |A|) ;. 3. tri : O(|V | log |V |) ;. 4. parcours de G 0 : O(|V | + |A0 |) = O(|V | + |A|) ;. • ⇒ total : O(|V | log |V | + |A|) ; • Peut-on faire mieux ? 1. si le premier parcours empile les sommets au lieu de les numéroter, pas besoin de tri ⇒ O(|V | + |A|) ;. 2. il existe un algorithme ne réalisant qu’un seul parcours [2] ⇒ même complexité, mais plus rapide ; 80.
(81) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Quelques intuitions sur l’algorithme de Kosaraju-Sharir • Sans (pour l’instant) prouver sa correction, demandons-nous comment et pourquoi cet algorithme fonctionne ;.
(82) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Quelques intuitions sur l’algorithme de Kosaraju-Sharir • Sans (pour l’instant) prouver sa correction, demandons-nous comment et pourquoi cet algorithme fonctionne ; • Intuitivement, le premier parcours permet de savoir quels sommets sont accessibles à partir de chaque sommet du graphe ;.
(83) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Quelques intuitions sur l’algorithme de Kosaraju-Sharir • Sans (pour l’instant) prouver sa correction, demandons-nous comment et pourquoi cet algorithme fonctionne ; • Intuitivement, le premier parcours permet de savoir quels sommets sont accessibles à partir de chaque sommet du graphe ; • La numérotation nous donne aussi des informations ; on constate que : ∀ u ∈ V (G ) :. date fin(u) = 1+. max. v ∈ descendants(u). date fin(v )..
(84) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Quelques intuitions sur l’algorithme de Kosaraju-Sharir • Sans (pour l’instant) prouver sa correction, demandons-nous comment et pourquoi cet algorithme fonctionne ; • Intuitivement, le premier parcours permet de savoir quels sommets sont accessibles à partir de chaque sommet du graphe ; • La numérotation nous donne aussi des informations ; on constate que : ∀ u ∈ V (G ) :. date fin(u) = 1+. max. v ∈ descendants(u). date fin(v ).. • Donc : v est un descendant de u ⇒ date fin(v ) < date fin(u) ;. 84.
(85) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Quelques intuitions sur l’algorithme de Kosaraju-Sharir • Sans (pour l’instant) prouver sa correction, demandons-nous comment et pourquoi cet algorithme fonctionne ; • Intuitivement, le premier parcours permet de savoir quels sommets sont accessibles à partir de chaque sommet du graphe ; • La numérotation nous donne aussi des informations ; on constate que : ∀ u ∈ V (G ) :. date fin(u) = 1+. max. v ∈ descendants(u). date fin(v ).. • Donc : v est un descendant de u ⇒ date fin(v ) < date fin(u) ; • La réciproque est fausse ; 85.
(86) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Quelques intuitions sur l’algorithme de Kosaraju-Sharir. • Maintenant qu’on “sait” quels sommets sont accessibles au départ de chaque sommet u, il faut savoir à partir de quels sommets on peut atteindre chaque sommet u ;. 86.
(87) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Quelques intuitions sur l’algorithme de Kosaraju-Sharir. • Maintenant qu’on “sait” quels sommets sont accessibles au départ de chaque sommet u, il faut savoir à partir de quels sommets on peut atteindre chaque sommet u ; • Comme on parcourt le graphe renversé G 0 , x est un descendant de y dans G 0 ⇔ y est un descendant de x dans G ;. 87.
(88) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Quelques intuitions sur l’algorithme de Kosaraju-Sharir. • Maintenant qu’on “sait” quels sommets sont accessibles au départ de chaque sommet u, il faut savoir à partir de quels sommets on peut atteindre chaque sommet u ; • Comme on parcourt le graphe renversé G 0 , x est un descendant de y dans G 0 ⇔ y est un descendant de x dans G ; • On démarre toujours d’un sommet u de date maximale dans G 0 , pour atteindre des descendants Du . . .. 88.
(89) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Quelques intuitions sur l’algorithme de Kosaraju-Sharir. • Maintenant qu’on “sait” quels sommets sont accessibles au départ de chaque sommet u, il faut savoir à partir de quels sommets on peut atteindre chaque sommet u ; • Comme on parcourt le graphe renversé G 0 , x est un descendant de y dans G 0 ⇔ y est un descendant de x dans G ; • On démarre toujours d’un sommet u de date maximale dans G 0 , pour atteindre des descendants Du . . . • Et donc dans G , Du est l’ensemble des sommets à partir desquels on peut atteindre u ;. 89.
(90) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Le graphe des composantes fortement connexes Définition 2 Soit G un graphe orienté. Le graphe des composantes fortement connexes de G est le graphe orienté H défini par :.
(91) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Le graphe des composantes fortement connexes Définition 2 Soit G un graphe orienté. Le graphe des composantes fortement connexes de G est le graphe orienté H défini par : • V (H) est l’ensemble {C1 , C2 , . . . , Cp } des composantes fortement connexes de G ;.
(92) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Le graphe des composantes fortement connexes Définition 2 Soit G un graphe orienté. Le graphe des composantes fortement connexes de G est le graphe orienté H défini par : • V (H) est l’ensemble {C1 , C2 , . . . , Cp } des composantes fortement connexes de G ; • A(H) = {(Ci , Cj ) | ∃u ∈ Ci , v ∈ Cj : (u, v ) ∈ A(G )}..
(93) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Le graphe des composantes fortement connexes Définition 2 Soit G un graphe orienté. Le graphe des composantes fortement connexes de G est le graphe orienté H défini par : • V (H) est l’ensemble {C1 , C2 , . . . , Cp } des composantes fortement connexes de G ; • A(H) = {(Ci , Cj ) | ∃u ∈ Ci , v ∈ Cj : (u, v ) ∈ A(G )}.. Exemple 4 5 4. 2 5. 7 0. C7 6 3. 1 6 2 4. C2. C5. 7 0 3 1. C0.
(94) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Graphes orientés acycliques. • Le graphe des composantes fortement connexes est acyclique ;. 94.
(95) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Graphes orientés acycliques. • Le graphe des composantes fortement connexes est acyclique ; • En effet, s’il contenait un cycle C , alors toutes les composantes reliées par C seraient mutuellement accessibles et ne devraient donc former qu’une seule composante fortement connexe ;. 95.
(96) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Graphes orientés acycliques. • Le graphe des composantes fortement connexes est acyclique ; • En effet, s’il contenait un cycle C , alors toutes les composantes reliées par C seraient mutuellement accessibles et ne devraient donc former qu’une seule composante fortement connexe ; • De nombreux problèmes deviennent plus simples sur les graphes orientés acycliques (ou DAG (pour directed acyclic graphs)) ;. 96.
(97) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Tri topologique. • On est déjà capables de reconnaı̂tre les DAG ;. 97.
(98) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Tri topologique. • On est déjà capables de reconnaı̂tre les DAG ; • Si un graphe est un DAG, on peut ordonner ses sommets de manière à rencontrer tous les prédécesseurs d’un sommet avant lui ; c’est ce qu’on appelle un ordre topologique ;. 98.
(99) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Tri topologique. • On est déjà capables de reconnaı̂tre les DAG ; • Si un graphe est un DAG, on peut ordonner ses sommets de manière à rencontrer tous les prédécesseurs d’un sommet avant lui ; c’est ce qu’on appelle un ordre topologique ; • Applications :. 99.
(100) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Tri topologique. • On est déjà capables de reconnaı̂tre les DAG ; • Si un graphe est un DAG, on peut ordonner ses sommets de manière à rencontrer tous les prédécesseurs d’un sommet avant lui ; c’est ce qu’on appelle un ordre topologique ; • Applications : • dans quel ordre réaliser les tâches d’un projet ?.
(101) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Tri topologique. • On est déjà capables de reconnaı̂tre les DAG ; • Si un graphe est un DAG, on peut ordonner ses sommets de manière à rencontrer tous les prédécesseurs d’un sommet avant lui ; c’est ce qu’on appelle un ordre topologique ; • Applications : • dans quel ordre réaliser les tâches d’un projet ? • combien de temps le projet va-t-il durer au minimum ?.
(102) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Tri topologique. • On est déjà capables de reconnaı̂tre les DAG ; • Si un graphe est un DAG, on peut ordonner ses sommets de manière à rencontrer tous les prédécesseurs d’un sommet avant lui ; c’est ce qu’on appelle un ordre topologique ; • Applications : • dans quel ordre réaliser les tâches d’un projet ? • combien de temps le projet va-t-il durer au minimum ? • .... 102.
(103) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Ordres topologiques Définition 3 Un ordre topologique pour un graphe orienté acyclique G est un ordonnancement L de ses sommets dans lequel tout sommet apparaı̂t après ses prédécesseurs.. 103.
(104) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Ordres topologiques Définition 3 Un ordre topologique pour un graphe orienté acyclique G est un ordonnancement L de ses sommets dans lequel tout sommet apparaı̂t après ses prédécesseurs.. Exemple 5 Voici un DAG pour lequel l’ordre (a, b, c, d, e, f ) est un ordre topologique : c b d. f e a. 104.
(105) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Algorithme de Kahn. • Un algorithme simple et intuitif dû à Kahn [1] nous permet de produire un ordre topologique comme suit :. 105.
(106) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Algorithme de Kahn. • Un algorithme simple et intuitif dû à Kahn [1] nous permet de produire un ordre topologique comme suit : 1. placer les sources (sommets de degré entrant nul) en premier lieu ;. 106.
(107) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Algorithme de Kahn. • Un algorithme simple et intuitif dû à Kahn [1] nous permet de produire un ordre topologique comme suit : 1. placer les sources (sommets de degré entrant nul) en premier lieu ;. 2. retirer les sources du graphe et recommencer ;. 107.
(108) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Algorithme de Kahn. • Un algorithme simple et intuitif dû à Kahn [1] nous permet de produire un ordre topologique comme suit : 1. placer les sources (sommets de degré entrant nul) en premier lieu ;. 2. retirer les sources du graphe et recommencer ;. • Si l’on arrive à “vider” le graphe de cette manière, le résultat est un ordre topologique ; sinon le graphe possède un cycle.. 108.
(109) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Déroulement de l’algorithme de Kahn. Exemple 6 c b d. f e a. Ordres et tri topologiques.
(110) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Déroulement de l’algorithme de Kahn. Exemple 6 c b d. f e a. Ordres et tri topologiques.
(111) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Déroulement de l’algorithme de Kahn. Exemple 6 c b d. f e. Ordres et tri topologiques.
(112) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Déroulement de l’algorithme de Kahn. Exemple 6 c b d. f e. Ordres et tri topologiques.
(113) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Déroulement de l’algorithme de Kahn. Exemple 6 c. d. f e. Ordres et tri topologiques.
(114) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Déroulement de l’algorithme de Kahn. Exemple 6 c. d. f e. Ordres et tri topologiques.
(115) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Déroulement de l’algorithme de Kahn. Exemple 6. d. f e. Ordres et tri topologiques.
(116) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Déroulement de l’algorithme de Kahn. Exemple 6. d. f e. Ordres et tri topologiques.
(117) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Déroulement de l’algorithme de Kahn. Exemple 6. f e. Ordres et tri topologiques.
(118) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Déroulement de l’algorithme de Kahn. Exemple 6. f e. Ordres et tri topologiques.
(119) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Déroulement de l’algorithme de Kahn. Exemple 6. f. Ordres et tri topologiques.
(120) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Déroulement de l’algorithme de Kahn. Exemple 6. f. Ordres et tri topologiques.
(121) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Implémentation de l’algorithme de Kahn. • L’algorithme de Kahn est simple à implémenter, mais il faut faire attention à sa complexité ;.
(122) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Implémentation de l’algorithme de Kahn. • L’algorithme de Kahn est simple à implémenter, mais il faut faire attention à sa complexité ; • La suppression répétée de sommets et d’arcs coûte cher ;.
(123) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Implémentation de l’algorithme de Kahn. • L’algorithme de Kahn est simple à implémenter, mais il faut faire attention à sa complexité ; • La suppression répétée de sommets et d’arcs coûte cher ; • Au lieu de faire ça, on va stocker les degrés entrants à part et les décrémenter ;.
(124) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. L’algorithme de Kahn proprement dit Algorithme 3 :. Kahn(G ). Entrées : un graphe orienté acyclique G . Sortie : les sommets de G ordonnés topologiquement. 1 2 3 4 5 6. 7 8 9 10 11 12 13. /* stocker les degrés entrants et les sources */ résultat ← liste(); sources ← pile(); degrés entrants ← tableau(G .nombre sommets(), 0); pour chaque v ∈ G .sommets() faire degrés entrants[v ] ← G .degré entrant(v ); si degrés entrants[v ] = 0 alors sources.empiler(v ); /* dépiler les sources, les ajouter au résultat, et empiler les nouvelles sources */ tant que sources.pas vide() faire u ← sources.dépiler(); résultat.ajouter en fin(u); pour chaque v ∈ G .successeurs(u) faire degrés entrants[v ] ← degrés entrants[v ] −1; si degrés entrants[v ] = 0 alors sources.empiler(v ); renvoyer résultat;. 124.
(125) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Complexité de l’algorithme de Kahn. • L’algorithme de Kahn se contente de parcourir le graphe, en maintenant le tableau degrés entrants en O(1) par opération ;. 125.
(126) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Complexité de l’algorithme de Kahn. • L’algorithme de Kahn se contente de parcourir le graphe, en maintenant le tableau degrés entrants en O(1) par opération ; • Donc sa complexité dépend directement de l’implémentation du graphe :. 126.
(127) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Complexité de l’algorithme de Kahn. • L’algorithme de Kahn se contente de parcourir le graphe, en maintenant le tableau degrés entrants en O(1) par opération ; • Donc sa complexité dépend directement de l’implémentation du graphe : • si l’on choisit une matrice d’adjacence, on a du O(|V |2 ).. 127.
(128) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Complexité de l’algorithme de Kahn. • L’algorithme de Kahn se contente de parcourir le graphe, en maintenant le tableau degrés entrants en O(1) par opération ; • Donc sa complexité dépend directement de l’implémentation du graphe : • si l’on choisit une matrice d’adjacence, on a du O(|V |2 ). • si l’on choisit une liste d’adjacence, on a du O(|V | + |A|).. 128.
(129) Correction de l’algorithme de Dijkstra. Composantes fortement connexes. Ordres et tri topologiques. Bibliographie. [1] A. B. Kahn. Topological sorting of large networks. Communications of the ACM, 5(11) :558–562, November 1962. [2] Robert Endre Tarjan. Depth-first search and linear graph algorithms. SIAM Journal on Computing, 1(2) :146–160, 1972.. 129.
(130)
Documents relatifs
• L’algorithme de Bellman-Ford recherche également des raccourcis entre les sommets ; • Le fonctionnement est différent de celui de Dijkstra, qui cherchait des chemins
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