Graph Sml中的二维映射到图形

Graph Sml中的二维映射到图形,graph,sml,smlnj,Graph,Sml,Smlnj,我有一个2D地图作为文件的输入,一行一行地保存它,然后运行Bfs或Dijkstra查找从开始(标记为S)到结束(标记为E)的最短路径,保存信息的正确结构是什么?我在C++中实现的是一个图,但是在SML中我很难做到这一点,因为我不能把节点都连接到一起。 < P>可以使用可变数组来实现。这是一个非常小的邻接矩阵实现,使用int选项的数组。顶点i和j之间的边由ith行和jth列中的值给出。如果值为None,则没有边;如果值为Some w,则边存在且具有权重w let is_some opt = m

我有一个2D地图作为文件的输入,一行一行地保存它,然后运行Bfs或Dijkstra查找从开始(标记为S)到结束(标记为E)的最短路径,保存信息的正确结构是什么?我在C++中实现的是一个图,但是在SML中我很难做到这一点,因为我不能把节点都连接到一起。

< P>可以使用可变数组来实现。这是一个非常小的邻接矩阵实现,使用
int选项的数组
。顶点
i
j
之间的边由
i
th行和
j
th列中的值给出。如果值为
None
,则没有边;如果值为
Some w
,则边存在且具有权重
w

let is_some opt =
  match opt with
  | None -> false
  | _ -> true;;

let unwrap opt =
  match opt with
  | None -> raise (Failure "unwrapped None")
  | Some x -> x;;

let add_edge g u v w =
  let us = Array.get g u in
  Array.set us v (Some w);;

let get_edge g u v =
  let us = Array.get g u in
  Array.get us v;;

let make_graph vertices =
  Array.make_matrix vertices vertices None;;

let neighbors g u =
  Array.get g u |>
  Array.to_list |>
  List.filter is_some |>
  List.mapi (fun i o -> (i, unwrap o));;


let g = make_graph 4;;
add_edge g 0 1 2;;
add_edge g 0 2 3;;
add_edge g 0 3 5;;
add_edge g 1 2 7;;
add_edge g 1 3 11;;
add_edge g 2 3 13;;
add_edge g 3 0 17;;
List.iter (fun (v, e) -> Printf.printf "0-(%i)->%i\n" e v) (neighbors g 0);;

这在OCaml中是存在的,但SML和OCaml之间的差异在很大程度上是较小的。

如果您愿意使用
ref
s,则可以使用可变参考单元格或数组:相关问题: