我必须为最长路径问题制定算法。
我有一个定向加权图,一个起始节点,一个停止节点和一个数字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];;
有人可以给我一些建议,甚至是理论上的这个吗?
答案 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
的路径。