【问题标题】:All-pair shortest path for minimum spanning tree最小生成树的全对最短路径
【发布时间】:2017-03-07 10:44:10
【问题描述】:

我正在尝试解决有关图的算法挑战,我已设法将其分解为以下内容:给定一个无向生成树,找到 2 个叶子,使得它们之间的成本最小。

现在我知道了 Floyd Warshall 算法,它可以找到时间复杂度 O(N^3) 和空间复杂度 O(N^2) 的所有对最短路径。问题的输入是 N = 10^5 所以 O(N^3) 和 O(N^2) 太多了。

有没有办法针对这个问题优化空间和时间复杂度?

【问题讨论】:

  • 对于无向最小生成树中两个顶点之间的“最小”成本,这两个顶点是固定的吗?还是您想以最低成本找到 2 个顶点?
  • 由于最小生成树是无环的,所以任意两个节点(没有节点重复)之间的路径是唯一确定的。
  • @Codor ,我将继续并详细说明您推荐的答案。
  • @PetarPetrovic 也许我的问题不够清楚。我的意思是找到 2 个(N 个)顶点,使它们之间的成本最小
  • 任何解释,为什么我的答案被否决..:/

标签: algorithm graph-theory


【解决方案1】:

正如@Codor 所说,详细说明,在 MST 中,任何一对节点都只有一条唯一路径,并且最短路径相同。 为了计算所有对的最短路径。 您可以选择遵循此算法。

  • 你基本上可以通过不断删除叶子节点直到只剩下一两个节点来选择找到MST的根。

    复杂性:centre node in a tree 这可以在 O(V) 即线性时间中实现

  • 选择其中之一作为根。使用Breadth First Search(BFS) 计算所有其他节点相对于根节点的距离。

    复杂度:O(V+E) ~ O(V) 在树的情况下

  • 现在您可以找到任意一对节点的 b/w 距离,称为 a,b。找到它的least common ancestor(lcp)。 那么有两种情况如果

    1. lcp(a,b) = r(树的根)。 dis(a,b) = dis[a] + dis[b]
    2. lcp(a,b) = c(不是根节点) dis(a,b) = dis[a] + dis[b] - 2 * dis[c]

其中 dis(x,y) = 距离 b/w 节点 x,y 和 dis[x] 节点 x 到根节点的距离 如果使用 Ranked Union Find 实现

复杂度: O(h) ,其中 h 是每对 (a,b) 的树的高度。 h = X/2,其中 X 是树的diameter。 所以总复杂度取决于否。叶节点对。

【讨论】:

  • 你的算法的时间复杂度是多少?
  • @PetarPetrovic 将复杂性部分添加到答案中
  • 在第 3 步中,您需要检查每一对叶子吗?
  • 是的,但我认为这里的状态记忆有助于加快进程并减少冗余计算
猜你喜欢
  • 2015-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-19
  • 2017-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多