【问题标题】:Algorithm for finding spanning tree with minimum range in a given graph在给定图中查找具有最小范围的生成树的算法
【发布时间】:2016-02-09 22:10:39
【问题描述】:

给定一个权重为 w(e) 的加权无向图 G(v,e),找到边的集合,使得每对顶点 (u,v)∈G 都连接起来(简而言之,spanning tree)并且所选边的权重范围最小(或最小权重与最大权重之差最小)。

我尝试了贪婪的方法,其中根据权重对边进行排序,然后在排序后的数组中选择两个连续边之间权重差异最小的边 (g[index = current_left],g[index+1 = current_right]) ,随后我根据 (current_left,current_left-j) 或 (current_right,current_right+j) 之间的最小差异向左或向右移动,其中 j 递增,直到我们找到至少一个未访问的边缘顶点。

例如:

这里我们可以得到的最小范围是通过选择权重为 {2,3,5} 的边,范围是 3。

请指出一个建议算法失败的测试用例,并建议一种算法来寻找这种生成树。

编辑:

预期时间复杂度为 O(|E|log|E|) 其中 |E|是边数。

【问题讨论】:

  • 如何选择第一条边?显然,在您的示例中,如果您从权重 7 的边缘开始,则无法找到最佳解决方案。
  • 在对边进行排序时,我们得到 2,3,5,7,2 和 3 之间的差异为 1,这是通过选择两条边可能实现的最小差异。所以首先我选择 2,3 然后在我相应地选择之后。
  • 那么,如果权重是1、2、100、102、104、108,你先选择1和2?我很确定您可以从中构建一个反例。
  • 是的,没错,我明白了。那么如何解决呢?
  • 一个明显的解决方案是枚举所有边的子集并找到一个生成树且权重最小的边。当然,时间复杂度是指数级的。那么运行时间有什么限制吗?

标签: algorithm graph range minimum spanning-tree


【解决方案1】:

你应该可以在O(E * (cost of MST computation)):

T = no tree
for all edge weights w_fix sorted in ascending order:
    for all edges e:
        if w(e) >= w_fix:
            set w'(e) = w(e) - w_fix
        else:
            set w'(e) = infinity
    find MST T' according to w'
    if T == no tree or max edge weight(T) > max edge weight(T'):
        set T := T'
print T

这个想法是一些边缘权重必须是最佳生成树中边缘之间的最小边缘权重;所以固定一个最小边缘权重并找到一个只包含比这更重的边缘的 MST。由于所有 MST 也是 minimum bottleneck spanning trees,因此这将起作用。


这是一个优化到对数平方因子的改进;基本思想保持不变。

sort edge array E[] by increasing weights

low := high := 0
opt_low := opt_high := 0
opt := infinity
connected := false

while (high < E.length - 1) or (connected):

    if not connected:
        high = high + 1
    else:
        low = low + 1

    update(connected)

    if connected:
        if E[high].weight - E[low].weight < opt:
            opt = E[high].weight - E[low].weight
            opt_low = low
            opt_high = high

print(opt, opt_low, opt_high)

这个想法是在边缘上保持一个滑动窗口,并使用连接来维护窗口。要维护连接信息,您将使用特殊的数据结构。其中有许多允许多对数时间成本来维护删除和添加边的连接信息,您可以找到有关这些数据结构的信息in these MIT 6.851 lecture notes

【讨论】:

  • 谢谢!!可以优化到 O(ElogE) 吗?
  • @RjlovesS 我看不到,但我也没有证明Ω(E * cost(MST)) 的下限。所以:可能,但我做不到。如果您知道如何做,请将其作为答案发布,因为我会对此感兴趣。
  • 我认为我们可以在 O(ElogE*logE) 中做到这一点,而不是对每个边进行线性作为最小值,我们可以在二进制中做到这一点,即选择一个中间元素作为最小边,如果我们能够构造生成树去右边,如果我们不能去左边,O(ElogE)是MST。你说什么?
  • @RjlovesS 我怀疑这行得通。根据您的规则,获取具有唯一最优生成树的完整图 G,边权重位于范围的下半部分,完整的 G' 具有 ... 在范围的上半部分。在这两种情况下,您都可以在第一次迭代期间构建生成树这一事实并不能告诉您接下来是查看较重的边还是较轻的边。对于二分搜索,您需要能够在每次迭代后丢弃搜索空间的线性部分,我不明白您为什么能够这样做。
【解决方案2】:

G Bach infact 描述的算法工作正常,运行时间为 O(m*m),其中 m 是边数(考虑到 mst 的计算需要 O(m) 时间)。这是在 codeforces edu 部分提出的问题。

【讨论】:

  • 请注意,这个答案可能对原始发帖人没有帮助。请详细说明。
猜你喜欢
  • 2013-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-06
  • 2020-05-01
  • 1970-01-01
相关资源
最近更新 更多