使用最小生成树查找从 A 到 B 的路径 - C/C++
Posted
技术标签:
【中文标题】使用最小生成树查找从 A 到 B 的路径 - C/C++【英文标题】:Finding path from A to B using a minimal spanning tree - C/C++ 【发布时间】:2012-07-09 16:03:39 【问题描述】:假设我们找到了一个最小生成树。现在,我们只需要 MST 中从 A 到 Z 的路径。我们如何在 O(n^2) 时间内做到这一点?
我们从根 A 开始。然后我们查看 Ax 形式的树中的所有边(其中 x 是任何顶点)。
然后,假设我们找到:AB、AC、AD 等... 然后对于每一个,我们寻找形式的边缘:Bx,Cx,Dx...这显然不是 O(n^2)。
那么在给定 MST 的情况下,找到路径 A -> Z 的更好/有效方法是什么?
谢谢
【问题讨论】:
边权重是点之间的距离,所以它们不一定是整数。 DFS 将如何工作?我们从 MST 创建 DFS? @user809240,为什么 O(n^2) 是一个目标?使用 MST 超过 O(n) 将很难做到(因为它有 n-1 个边缘用于 n 个点) 【参考方案1】:Depth-first search 就足够了,在最坏的情况下 O(|V| + |E|)。您的输入是 MST 这一事实意味着您不必担心任何循环检测,就像在一般图表中那样。
【讨论】:
还应注意,在 MST 中,|E|
最多为|V|
,而不是一般图中的|V|^2
,因此算法将是O(|V|)
。比O(|V|^2)
的目标快得多。【参考方案2】:
查找Minimum Spanning Tree,你会发现它是一个将所有顶点连接在一起的最小子图。这意味着每条边都将最多使用一次。您可以只使用 DFS 或 BFS 来查找所需的路径,而无需检查循环,因为您已经拥有 MST。
【讨论】:
【参考方案3】:在创建 MST 期间,您可以填写 parent[],因此在此之后使用简单的回溯,您将能够在没有 DFS 的情况下找到路径。
【讨论】:
【参考方案4】:如果你仔细想想,Prim 寻找 MST 的算法实际上只是 Dijkstra 的伪装。因此,如果您找到一条,MST 已经为您提供了最短路径(如上所述,想想 DFS)。
【讨论】:
以上是关于使用最小生成树查找从 A 到 B 的路径 - C/C++的主要内容,如果未能解决你的问题,请参考以下文章