(* Dijkstra's Algorithm *) let fun ordering((v1,d1), (v2,d2)) = Int.compare(d1,d2) val q: (vertex*int) Heap.heap = Heap.create(ordering) val dist: VertexMap.map = VertexMap.create() fun expand(v: vertex, d: int) = let fun handle_edge(e: edge) = let val (_, v', w) = Graph.edgeinfo(e) in case get(dist, v') of SOME(d') => if d+w < d' then (add(dist, v', dist+w); incr_priority(q, v', d+w) ) else () | NONE => (add(dist, v', d+w); insert(q, v', d+w) ) end in app handle_edge (Graph.outgoing(v)) end in add(visited, v0, 0); insert(q, (v0, 0)); while (not (empty_queue(q))) do expand(extract_min(q)) end