按边长度递归搜索图中所有可行路径

Recursive search of all viable paths in graph by edge length

本文关键字:路径 搜索图 递归      更新时间:2023-10-16

我有学校的习惯来创建一个程序,该程序获取一个图并找出最小生成树,条件是两点之间的路径(在运行开始时预先选择(将最短它们之间的边数

任务本身还可以,但我挣扎的地方是优化。当我找到 A 和 B 之间的路径(预选点(时,我尝试递归地找到 DFS 的所有其他可能选项,然后执行 MST 并选择最小的选项。由于路径必须是最少的边数,并且我通过第一个 BFS 找到了其中一条路径,我知道我可以在 X 递归后切断我的 DFS 搜索,其中 X 是在 BFS 中找到的 A 和 B 之间的边数。它在某些类型的图形中工作得非常快(其中边的数量是顶点数量的 3 倍(,但是当边缘例如大 10 倍时,它只是不停地运行。

我问我的朋友一个提示,他说我他使用 BFS 递归地查找其他路径,他还可以,但是性能有什么区别?DFS会先尝试跑下来,并在到达某个点或浪费可用的跳跃时停止,BFS先变宽,然后以相同的深度步骤结束所有路径,但我仍然做同样的跳跃,对吗?

我在这里错过了什么?还是我理解错了他?感谢您的任何想法。

编辑:我试图检查我已经在特定DFS运行中访问了哪些边缘,以避免相反的方向,回到我所在的点等等,但它只在某些图表组上产生延迟,而对其他图表没有明显帮助。

EDIT2:交换的边和顶点数量(顶点不能多于边(

所以我完成了我的学习,当寻找两点 A/B 之间的其他路径/所有路径时,DFS 和 BFS 得到了相同的结果。

对我来说,关键是解决方案的正确优化。我的最终解决方案结合了广泛和深入,并像这样工作(也许它可以做得更快,但我对此表示怀疑(:

  1. 我们知道点 A/B 之间的长度(以边数为单位((我们 跑了一次BFS找出路径(。
  2. 我们运行类似BFS的东西 终点B,在每个顶点中,我们标记了我们做了多少跳跃 从最后开始,并在所有传出边缘上再次调用它(我们在以下情况下停止 hops == lengthOfPath(A,B((.
  3. 然后我们从源点 A 做 DFS 并将所有保存适当跃点值的顶点合并到路径中 通过递归。

换句话说,我们通过它们从 B 开始的可访问性来标记所有点,然后从 A 开始,我们遍历那些可访问的点(使用默认值以外的设置值和来自 A 的跃点的适当值(并将所有可能的路径组合在一起。

有我们的道路。(我故意留下这个模糊,因为任务仍然处于活动状态(。如果将来有人需要更好的解释,请发表评论,我会详细说明。如果有人找到更好的解决方案,请将其作为您的答案发布,如果正确,我会将其作为正确答案。