Ocaml:最长路径

时间:2015-03-18 10:49:33

标签: path ocaml breadth-first-search

我必须为最长路径问题制定算法。

我有一个定向加权图,一个起始节点,一个停止节点和一个数字k。

算法必须说明在图表上是否存在从起始节点到停止节点的路径,其长度至少为k。

真正的问题是我必须使用BFS访问algortihm而不是DFS。在Ocaml上,BFS使用Queue,节点插入结构的末尾:

    let breadth_first_collect graph start =
        let rec search visited = function
             [] -> visited
             | n::rest -> if List.mem n visited
                then search visited rest
                else search (n::visited) (rest @ (succ graph n))
                (* new nodes are put into queue *)
in search [] [start];; 

有人可以给我一些建议,甚至是理论上的这个吗?

1 个答案:

答案 0 :(得分:2)

在BFS中,在完成当前图层之前,您基本上不应该进行更深入的处理。这意味着在每一步中你应该采取一组后继者,削减数据,然后连续递归到每一个。这是算法的第一个近似值(未经测试):

let breadth_first_collect succ graph start =
  let rec search visited v =
    let succs = succ graph v |>
                List.filter (fun s -> List.mem s visited) in
    List.map (search (succs @ visited)) succs |> List.concat in
  search [] start

因此,我们首先访问队列之前的所有孩子(也就是succs),然后递归地逐渐下降到每个孩子中。

这也是第一次近似。由于您需要知道它所指的路径长度,您需要单独存储队列中的每个路径,并且不能只拥有一组所有访问过的顶点。这意味着,您的队列必须是vertex list list。在这种情况下,您可以收集所有可能的路径,并查找是否存在大于k的路径。