繁体   English   中英

通过边长递归搜索图中所有可行的路径

[英]Recursive search of all viable paths in graph by edge length

我校分配新建分配FY创建一个程序,它得到一个图表,发现极小子出来生成树与条件的两个点(这是在运行启动预选)之间的路径将以数字之间的边缘被最短的。

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

我问我的朋友一个提示,他说我使用BFS递归查找其他路径,他还可以,但是性能有何不同? DFS将首先尝试运行,并在到达特定点或浪费可用的跃点时停止运行,BFS首先变宽,然后以相同的深度步长结束所有路径,但是我仍然做同样多的跃迁吧?

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

编辑:我试图检查我在特定DFS中已经访问过的哪些边,以避免朝相反的方向运行,回到我所处的位置,依此类推,但它只会在某些图形组上产生延迟,而对其他图形却没有明显的帮助。

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

因此,我完成了分配工作,并且在查找A / B两点之间的其他路径/所有路径时,据我发现,DFS和BFS的结果相同。

对我而言,关键是正确优化解决方案。 我的最终解决方案结合了不断扩展和深入发展的过程(例如,它可以更快地完成,但我对此表示怀疑):

  1. 我们知道点A / B之间的长度(以边数为单位)(我们运行了BFS一次以找出路径)。
  2. 我们从端点B运行类似BFS的操作,并在每个顶点中标记从端点进行的跳数,并在所有出局边再次调用此步(跳数== lengthOfPath(A,B)时停止)。
  3. 然后,我们从源点A进行DFS,并通过递归将所有拥有适当跳数的顶点合并到路径中。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM