Path Ocaml:最长路径

Path Ocaml:最长路径,path,ocaml,breadth-first-search,Path,Ocaml,Breadth First Search,我必须为最长路径问题制定一个算法 我有一个定向加权图,一个开始节点,一个停止节点和一个数字k 算法必须说明,在图上,是否存在从起始节点到停止节点的路径,长度至少为k 真正的问题是我必须使用BFS访问算法,而不是DFS。在Ocaml上,BFS使用队列,节点插入到结构的末尾: let breadth_first_collect graph start = let rec search visited = function [] -> visit

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

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

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

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

    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];; 

有人能给我一些建议,甚至是理论上的建议吗

在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
因此,我们首先访问所有子级(aka
succs
)将数据预分配到队列,然后递归地下降到一行中的每个子级

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