两点之间最短路径的生成树

时间:2018-10-10 19:46:00

标签: graph minimum-spanning-tree spanning-tree

我有加权无向图。我需要以尽可能少的成本找到生成树,以使A点和B点之间的距离尽可能小。 例如,我有以下图形:graph。 最小distance between A and B is 2。 最小的生成树看起来像this。但这会使A和B之间的距离= 3。

现在我正在这样做:

  1. 使用BFS查找图形中AB之间的距离。
  2. 使用DFS查找从步骤1开始具有长度的AB之间的所有路径。
  3. 从第2步的每条路径生成生成树。
  4. 比较它们并得到最少的一个。

一切正常,直到得到A-B距离= 12的图形为止。 第二步则花费太多时间。有什么更快的方法吗?谢谢。

2 个答案:

答案 0 :(得分:2)

解决此问题的最快/最有效方法是使用 Dijkstra的最短路径算法。这是一种贪婪算法,具有以下基本结构:

1-图上所有节点的起始距离为“无限”

2-从第一个节点(本例中为节点A)开始,并跟踪每个边缘权重,以从该节点A到达其每个邻居。

3-选择当前最短的边,然后将其跟随到您的下一个节点,现在我们将其称为节点C

4-现在,对于C的每个邻居,将当前距离(如果适用,包括无穷大)与A到C的边的和与C到当前邻居的最短边的和相比较。如果比当前距离短,则将其更新为新距离。

5-继续执行此过程,直到访问了所有节点,然后到达要查找的最短路径的节点(即示例中的B)

这是查找两个节点之间最短路径的一种非常有效的方法,运行时间为 O(V ^ 2) not O( nlogn)。如您所见,通过将此算法设为贪婪算法,我们将不断根据可用的本地信息选择最佳解决方案,因此,我们将永远不必回头来更改我们的决策。

这也消除了您的示例中对BFS DFS的需求。希望这会有所帮助!

答案 1 :(得分:0)

虽然第二步是正确的,但我认为问题在于您执行的操作过多。

您正在同时进行BFS和DFS,这将非常昂贵。相反,我建议做的是使用几种不同的遍历技术之一,以最小化计算成本。

这是找到最短路径的常见问题,流行的解决方案之一是Dijkstra的算法。这是一篇有关该主题的文章。 https://www.geeksforgeeks.org/dijkstras-shortest-path-algorithm-greedy-algo-7/

简而言之,此算法的作用是:以起点A为起点,然后生成最小生成树,直到击中点B,然后存在一条可以使A到达B的单一路径,即最短的路径。

此方法和您的算法都在O(nlogn)中运行,但是在实践中,可以将此解决方案视为运行单个BFS,而不是同时运行BFS和DFS。