通过修改边缘更新最小生成树

时间:2012-03-29 20:58:57

标签: algorithm graph-theory minimum-spanning-tree

带有MST的图表(正权重边) 如果某个边缘,e被修改为新值,那么更新MST而不完全重建它的最佳方法是什么。我认为这可以在线性时间内完成。此外,似乎我需要一个不同的算法,基于1)e是否已经是MST的一部分,2)新边缘e是大于还是小于原始

2 个答案:

答案 0 :(得分:39)

有4个案例:

  1. Edge在MST中,您减少了边缘值:
    目前的MST仍然是MST

  2. 边缘不在MST中并且您减少了边缘值:
    将此边添加到MST。现在你已经完成了一个周期 根据MST中的cycle property,您需要查找并删除该周期中具有最高值的边。您可以使用dfs或bfs来完成。复杂性O(n)。

  3. Edge在MST中,您增加了edge的值:
    从MST中删除此边缘。现在您有2个应连接的连接组件。您可以使用O(n)(bfs或dfs)计算两个组件。您需要找到连接这些组件的最小值的边。按其值按升序迭代边缘。复杂性O(n)。

  4. Edge不在MST中,并且您增加了edge的值:
    目前的MST仍然是MST

答案 1 :(得分:1)

我的O(n)解决方案基于以下假设:在开始修改边缘之前,您应该找到MST(图中没有给出)。为此,您可以使用在O(n log n)中工作的Kruskal算法,并且作为副作用生成有序的边列表。它的成本主要是排序,因此当你修改边缘的权重时,你可以从O(log n)中的排序列表中删除它,然后用新值插入它,也在O(log n)中,最后调用Kruskal再次算法,现在以线性时间运行,因为边是排序的。

这是您所要求的线性解决方案,但看起来可以更快地完成。