Dijkstra avec file de priorité
Exercice · OCaml (option informatique), chapitre 19 — Files de priorité : le tas binaire
Énoncé
Esquisser Dijkstra (chapitre 16) en utilisant la file de priorité de couples, et donner sa complexité.
Corrigé
let dijkstra_tas adj depart n_aretes =
let n = Array.length adj in
let infini = 1_000_000 in
let dist = Array.make n infini in
let t = cree_c (n + n_aretes) in (* capacité : assez de poussées *)
dist.(depart) <- 0;
insere_c t (0, depart);
while t.taille > 0 do
let (du, u) = extrait_min_c t in
if du = dist.(u) then (* ignorer les entrées périmées *)
List.iter (fun (v, poids) ->
if du + poids < dist.(v) then begin
dist.(v) <- du + poids;
insere_c t (dist.(v), v) (* on pousse la nouvelle distance *)
end
) adj.(u)
done;
dist
Au lieu de chercher le minimum en , on l'extrait du tas en . À chaque relâchement réussi, on pousse le couple (nouvelle_distance, v) ; une même destination peut être poussée plusieurs fois, d'où le test du = dist.(u) qui ignore les entrées périmées. Coût — bien meilleur que le du chapitre 16 sur les graphes creux. (extrait_min_c est la version « couples » de extrait_min.)
Les autres exercices de ce chapitre Le cours du chapitre
Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.