我需要使用ML编写一些函数,这个函数接收定向图的边缘列表 [(1,2),(1,3),(3, 2)] ,它意味着从1到2和从1到3的有向边...,我还收到两个顶点,我需要找到从第一个顶点到第二个的所有可能方式以及可能路径的列表,例如对于顶点 1,2 ,我需要显示列表 [[1,2],[1,3,2]] ,我该怎么办呢ML如果无法存储有关顶点的数据,请提前感谢任何想法。
答案 0 :(得分:3)
如果要存储有关顶点的数据,则需要从顶点到数据的有限映射。 地图可能会提供如下签名:
type 'a vmap (* vertex map *)
val empty : 'a vmap (* empty map *)
val insert : vertex * 'a * 'a vmap -> 'a vmap (* add info about a vertex *)
val lookup : vertex * 'a vmap -> 'a option (* look for info about a vertex *)
要实现此签名,您可以考虑一个简单的vertex * 'a
对列表,或者像平衡二叉搜索树那样雄心勃勃的东西。
答案 1 :(得分:2)
您可以存储有关顶点的数据!
例如,您想记录您访问过的顶点吗?
假设您有一个函数可以递归地探索当前顶点中所有可能未探索的边。
它可以接受未探测边的矢量,加上当前顶点和目标顶点。它将返回一个成功进入目标顶点的路径向量。
在内部,它将定位从该顶点开始的边集,并对该集中的每条边进行递归,将所选边从未探测边列表中移除到每个子函数中。
答案 2 :(得分:0)
我在Yahoo! Answers上看到了同样的谜题(呃问题)和我 回答了。
实现最初是基于创建树的设计 遍历图表;但最终它最终与设计相匹配 先前由Alex Brown表达。
最初是planning was done in Haskell,因此这个辅助函数:
fun replicate len el =
if len = 0 then nil else el::replicate (len -1) el
主要实施:
fun routes dst (edges:(int * int) list) src =
let val (very_possible,remotely_possible) =
if null edges
then (nil,nil)
else List.partition ((fn s=> s = src) o #1) edges
val (raw_solutions,dsts_is_nx_srcs) =
List.partition ((fn d => d = dst) o #2) very_possible
val solutions = replicate (length raw_solutions) [src,dst]
val full_rest_routes =
let val rest_rest_routes =
map (routes dst remotely_possible)
( map #2 dsts_is_nx_srcs )
in map (fn lst => src::lst) (List.concat rest_rest_routes)
end
in case (very_possible, solutions, remotely_possible)
of (nil, _, _) => nil
| (_::_, (p::ps), _) => solutions @ full_rest_routes
| (_::_, nil, _::_) => full_rest_routes
| (_ , nil, nil ) => nil
end
用户界面:
fun getPaths edges src dst = routes dst edges src
上面的代码来自routes4.sml; 但是省略了测试和IO。即使这不是太久,我仍然希望 它可以更简单。