Graph Ocaml:使用bfs的最长路径

Graph Ocaml:使用bfs的最长路径,graph,path,ocaml,breadth-first-search,weighted,Graph,Path,Ocaml,Breadth First Search,Weighted,问题如下:给定一个定向加权图、一个开始节点、一个结束节点和一个数字k,验证是否存在从开始节点到结束节点的路径,路径长度至少为k。 这是我写的代码,它是正确的,但只是在特定的图形中。例如,权重为1的g1如下所示: 使用权重s1和g1执行我的代码是: 现在,如果我在另一个图形中执行代码,例如: let weights3 =[(1,1,2);(1,1,3);(1,1,4);(2,1,5);(2,1,6);(3,1,7);(3,1,8);(4,1,9);(4,1,10);(10,1,1)];; le

问题如下:给定一个定向加权图、一个开始节点、一个结束节点和一个数字k,验证是否存在从开始节点到结束节点的路径,路径长度至少为k。
这是我写的代码,它是正确的,但只是在特定的图形中。例如,权重为1的
g1
如下所示:

使用权重s1和g1执行我的代码是:

现在,如果我在另一个图形中执行代码,例如:

let weights3 =[(1,1,2);(1,1,3);(1,1,4);(2,1,5);(2,1,6);(3,1,7);(3,1,8);(4,1,9);(4,1,10);(10,1,1)];;
let f3 = function
1 -> [2;3;4]
| 2 -> [5;6]
| 3 -> [7;8]
| 4 -> [9;10]
| 10 -> [1]
| _ -> [];;
let g3 = Graph f3;;

执行以下操作时,我的代码失败:


这是因为在找到至少为k的路径之前的最后一条路径从节点2开始,并且没有一条路径可以将2与10连接起来,但是存在权重为10的1到10之间的路径,并且未选择该路径。有人能告诉我如何更改代码以确保问题在每种类型的图形中都得到解决吗?

正如您所说,块

    else if((cost_of_path (List.rev path) weight) >= k)
    then (List.rev (List.tl path)) @ bfs (List.hd path) (final_node) (Graph succ)
可能会失败,因为无法确保存在从当前路径的最后一个元素到最终节点的路径

最简单的修复方法是删除此块并。。。就这样


当一条部分路径大于长度阈值时,无需切换算法(这不是尝试优化的正确算法)。

如果我删除该块,例如调用“find_path 1 5 10 Weights 2 g2”会使算法始终尝试扩展路径,但不存在具有该成本的路径。算法是循环的。我该怎么解决呢?当然,用你的算法,你需要一个步骤数的界限。对于你的算法永远不会结束的步数有一个简单的上界:如果我们称n为顶点数,它最多可以使s步到达一个循环的开始+k步在循环中+n纠正潜在的循环周期+(n-s)步到达最后一个顶点。所以最多2 n+k。请注意,这是非常低效的,您应该尝试找到更好的算法。您能建议我如何实现更好的算法吗?我认为最好的解决方案是,当它达到k时,它会断开圆圈并检查节点之间是否存在路径,但我的实现失败了,正如我们已经看到的D:可以计算图的强连接组件,然后使用强连接组件的DAG查找从起始组件到最后一个组件的路径,而无需处理循环。一旦有了强连接组件的路径,就可以沿顶点重建路径。可以用到端点的距离标记每个节点(不包括循环),并标记(至少一个节点)循环。如果已经找到路径>k,那么就完成了。否则,请从开始处查找一条路径,该路径将命中您标记的某个循环。
    else if((cost_of_path (List.rev path) weight) >= k)
    then (List.rev (List.tl path)) @ bfs (List.hd path) (final_node) (Graph succ)