Juste l’algorithme de Prim, commenté, en Caml Light¶
let rec insère compare l e = match l with
| [] -> [e]
| h::t when compare e h -> e::h::t
| h::t -> h::insère compare t e
;;
let extrait_min = function
| [] -> invalid_arg "extract_min"
| h::t -> h, t
;;
let graphe = [|[1,1;2,2];[2,3;3,4];[3,1];[]|];;
let prim graphe =
let n = vect_length graphe in
let visité = make_vect n false in
visité.(0) <- true;
let rec ajouter tas voisins j = match voisins with (* ajoute au tas les arêtes partant de j *)
| [] -> tas
| (k,p)::t -> ajouter (insère (fun (a,_,_) (b,_,_) -> a < b) tas (p,j,k)) t j (* sous la forme (poids, départ (j), arrivée) *)
in let rec aux arbre tas =
if tas = [] then arbre else (* plus de tas, on a fini *)
let (p,i,j), tas = extract_min tas in
if not visité.(j) then ( (* si cette arête ne joint pas deux sommets de l'arbre *)
visité.(j) <- true;
aux ((i,j)::arbre) (ajouter tas graphe.(j) j) (* on ajoute l'arête à l'arbre et on continue avec le tas augmenté des voisins de j *)
) else (* sinon on jette l'arête *)
aux arbre tas
in aux [] (ajouter [] graphe.(0) 0) (* le tas est initialisé aux voisins de 0, mais ça marche aussi avec 1 et peut-être même avec 2 *)
;;
prim graphe;;