按边长度递归搜索图中所有可行路径
Recursive search of all viable paths in graph by edge length
我有学校的习惯来创建一个程序,该程序获取一个图并找出最小生成树,条件是两点之间的路径(在运行开始时预先选择(将最短它们之间的边数。
任务本身还可以,但我挣扎的地方是优化。当我找到 A 和 B 之间的路径(预选点(时,我尝试递归地找到 DFS 的所有其他可能选项,然后执行 MST 并选择最小的选项。由于路径必须是最少的边数,并且我通过第一个 BFS 找到了其中一条路径,我知道我可以在 X 递归后切断我的 DFS 搜索,其中 X 是在 BFS 中找到的 A 和 B 之间的边数。它在某些类型的图形中工作得非常快(其中边的数量是顶点数量的 3 倍(,但是当边缘例如大 10 倍时,它只是不停地运行。
我问我的朋友一个提示,他说我他使用 BFS 递归地查找其他路径,他还可以,但是性能有什么区别?DFS会先尝试跑下来,并在到达某个点或浪费可用的跳跃时停止,BFS先变宽,然后以相同的深度步骤结束所有路径,但我仍然做同样的跳跃,对吗?
我在这里错过了什么?还是我理解错了他?感谢您的任何想法。
编辑:我试图检查我已经在特定DFS运行中访问了哪些边缘,以避免相反的方向,回到我所在的点等等,但它只在某些图表组上产生延迟,而对其他图表没有明显帮助。
EDIT2:交换的边和顶点数量(顶点不能多于边(
所以我完成了我的学习,当寻找两点 A/B 之间的其他路径/所有路径时,DFS 和 BFS 得到了相同的结果。
对我来说,关键是解决方案的正确优化。我的最终解决方案结合了广泛和深入,并像这样工作(也许它可以做得更快,但我对此表示怀疑(:
- 我们知道点 A/B 之间的长度(以边数为单位((我们 跑了一次BFS找出路径(。
- 我们运行类似BFS的东西 终点B,在每个顶点中,我们标记了我们做了多少跳跃 从最后开始,并在所有传出边缘上再次调用它(我们在以下情况下停止 hops == lengthOfPath(A,B((.
- 然后我们从源点 A 做 DFS 并将所有保存适当跃点值的顶点合并到路径中 通过递归。
换句话说,我们通过它们从 B 开始的可访问性来标记所有点,然后从 A 开始,我们遍历那些可访问的点(使用默认值以外的设置值和来自 A 的跃点的适当值(并将所有可能的路径组合在一起。
有我们的道路。(我故意留下这个模糊,因为任务仍然处于活动状态(。如果将来有人需要更好的解释,请发表评论,我会详细说明。如果有人找到更好的解决方案,请将其作为您的答案发布,如果正确,我会将其作为正确答案。
- 对于MacOS上的G++,如何添加默认的include目录/usr/local/include和默认的库搜索路径/usr
- 按边长度递归搜索图中所有可行路径
- 提升图广度优先搜索前置编译错误
- 将共享库的搜索路径更改为生成文件中提供的 rpath
- 添加 #include 的搜索路径
- 提升图:当我的图使用 listS 作为 VertexList 时,如何调用深度优先搜索()?
- 为什么"/usr/include"不在 GCC 默认搜索路径中
- 使用迭代深度优先搜索算法的未加权图的最短路径
- 如何仅在 2 个节点之间获取最短路径,给定邻接列表有向图?
- 如何从路径字符串加载Gdiplus::位图
- 如何在双向图中找到两条不相交的路径?
- 如何从客户端为COM服务器设置dll搜索路径?
- C++计算有向图中的最短路径
- MFC:重写附属 DLL 中 RC 文件中的位图路径
- 链接库时的默认目录上的GCC或G 路径搜索顺序
- 显示深度优先搜索图遍历C++
- OSX 运行时动态库路径搜索
- Boost:从最短路径创建图
- 从一个2D矩阵中创建一个表示所有可能路径的图
- 在c++中使用深度优先搜索查找图数据结构中所有可能的路径