let dijkstra (adj: 'a -> ('a * int) list) (v1:'a) (v2:'a) =
let visited = Hashtbl.create 97 in
let rec loop h =
if is_empty h then raise Not_found;
let (w,(v,p)),h = extract_min h in
if v = v2 then
List.rev p, w
else
let h =
if not (Hashtbl.mem visited v) then begin
Hashtbl.add visited v ();
List.fold_left (fun h (e,d) -> add (w+d, (e, e::p)) h) h (adj v)
end else
h
in
loop h
in
loop (add (0,(v1,[])) (empty()))