如何查找 2 个顶点之间的所有可能路径

Posted

技术标签:

【中文标题】如何查找 2 个顶点之间的所有可能路径【英文标题】:How to Find All possible paths between 2 vertices 【发布时间】:2015-01-13 02:42:22 【问题描述】:

我正在调试一个遗留代码,其中道路网络由Boost Graph 表示。 A_Star 搜索没有给我 2 个特定点之间的最短路径,我知道 boost 不会错(直到我调试了我的代码一千次)。

要手动调试,我需要知道如何打印两个顶点之间的所有可能路径。在我的输出中,每条路径都应该由一系列边及其对应的权重表示。

我很重视你的帮助和cmets

【问题讨论】:

在 DAG 中,广度优先搜索。如果它是无向的或有一个循环,则可能有无限数量的路径。但仍然是广度优先搜索。 另外,请检查您在 A* 上的启发式算法...它可能无效。 @Barry 感谢您的提示。我去看看。我相信我会带着更多的提示请求回来:) 描述复杂性的相关问题是here。 【参考方案1】:

A* 基于启发式。如果遗留使用 A*,则意味着问题更复杂,然后只需找到最短路径即可。

要找到 2 个顶点之间的最短路径,有一些 Graph 算法,Dijkstra 是最容易实现的(确保也使用循环检查)。这些是确定性的。

如果您需要知道 2 个顶点之间的所有路径,则该路径是 NP complete 的,这意味着您需要进行回溯。

A* 通常用于解决 NP 完全问题。结果不是最好的路径,只是在体面的时间内找到的一个非常好的路径。

A* 的启发式算法用于删除递归或将算法从回溯转换为广度优先搜索(通常是后者)。

A* 算法和 Dijkstra 可解决的问题之间的差异示例如下(从我的脑海中):

在曼哈顿找到从 X、Y 角到 X1、Y1 角的最短道路(可通过 Dijkstra 或在曼哈顿 BFS 的情况下求解)

考虑交通和红绿灯,根据特定时间选择曼哈顿从拐角 X,Y 到拐角 X1,Y1 的最佳路线(因此边缘 1,1 到 1,2 的成本之间存在显着差异如果您在 t0 到达 1,1,并且如果您在 t1 > t0 到达 1,1,例如:该部分道路在 t1 被阻塞 10 小时)。

【讨论】:

以上是关于如何查找 2 个顶点之间的所有可能路径的主要内容,如果未能解决你的问题,请参考以下文章

c_cpp 计算两个顶点之间的所有可能路径

如何返回图中2个节点之间所有可能路径的2D数组? (C ++)

最小公倍数

查找 2 个树节点之间的路径

哈密 顿路径算法时间复杂度

在给定起始顶点和深度限制的循环定向图中寻找所有可能的路径。