Graph Sml中的二维映射到图形
我有一个2D地图作为文件的输入,一行一行地保存它,然后运行Bfs或Dijkstra查找从开始(标记为S)到结束(标记为E)的最短路径,保存信息的正确结构是什么?我在C++中实现的是一个图,但是在SML中我很难做到这一点,因为我不能把节点都连接到一起。 < P>可以使用可变数组来实现。这是一个非常小的邻接矩阵实现,使用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
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,则可以使用可变参考单元格或数组:相关问题: