如果添加边,则更新最小生成树

时间:2015-06-17 02:27:19

标签: algorithm graph tree runtime big-o

我对以下问题有可能的解决方案,但不确定是否正确:

假设我们已经为加权的无向图T找到了最小生成树G = (V,E)。我们希望能够有效地更新T G稍微改变一下。

将边添加到G以生成新图表。提供一个使用T的算法,在O(|V|)时间内为新图表找到最小生成树。

我的算法:

for each vertex do
   if smallest edge not in T then
      replace this edge with existing edge in T
      break
   end if
end for

我在编写伪代码方面没有太多经验,因此我的算法可能过度简化或不正确。如果我错了,请纠正我。谢谢!

2 个答案:

答案 0 :(得分:3)

不知道你的算法是否正确,但它至少看起来不是O(|V|),因为得到的最小边缘不在T"无法在O(1)中完成顶点。

将边e=(u, v)添加到MST T的最常用方法是:

  • T中从uv运行BFS,以检测该路径中具有最大值的边缘。 (O(|V|)
  • 如果该边缘的重量大于您尝试添加的边缘的重量,请移除旧边缘并添加新边缘。否则,什么都不做,因为新的边缘不会改善MST。 (O(1))。

此解决方案背后的基本原理是,只需将边添加到T中就可以创建一个周期,并且要恢复MST属性,您必须从该周期中删除具有最大值的边。

答案 1 :(得分:0)

是的,您的算法似乎是正确的。我会修改你的伪代码以澄清"如果最小的事件边缘不在T中那么"所以你的新算法是这样的:

for each vertex do
   if smallest incident edge not in T then
      replace this edge with existing edge in T
      break
   end if
end for

矛盾证明:

存在两种情况:新边缘在MST中或者它不是。对于以下情况:假设算法不替换T中的边。这必须意味着T中的所有边都小于入射在同一顶点上的其他边。这是一个矛盾,因为这意味着新的边缘不在T的MST中。

另一个案例的证据是一个相互矛盾的类似证据。