使用最小生成树查找从 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++的主要内容,如果未能解决你的问题,请参考以下文章

过路费(最小生成树+lca)

prim求最小生成树

普里姆算法(Prim)与最小生成树问题

bzoj3732 -- 最小生成树+倍增

数据结构trie树

数据结构一道题 根据最小生成树的Mst性质,可以得出 A最长边不包含于任一棵最小生成树 B最短边闭