如果图中的一个边缘改变了它的重量,如何从旧的MST获得新的MST?

时间:2012-11-18 05:14:00

标签: algorithm graph-algorithm

我们知道原始图表和原始MST。现在我们在图中更改边的权重。除了Prim和Kruskal之外,我们有什么方法可以从旧的MST中生成新的MST?

3 个答案:

答案 0 :(得分:2)

我将如何做到这一点:

  • 如果更改的边缘位于原始MST中:
    • 如果它的重量减轻了,那么它当然必须在新的MST中。
    • 如果其重量增加,则将其从原始MST中删除,并查找连接剩余两个子树的最低权重边缘(这可以再次选择原始边缘)。这可以通过构建disjoint-set data structure以保持两个子树,并按重量对剩余边缘进行排序,以类似Kruskal的方式有效地完成:选择第一个具有不同集合中的端点的边缘。如果你知道一种从不相交的数据结构中快速删除边缘的方法,并且你使用Kruskal的算法构建了原始的MST,那么你可以避免在这里重新计算它们。
  • 否则:
    • 如果它的重量增加,那么当然它将保持在MST之外。
    • 如果重量减轻,请将其添加到原始MST中。这将创造一个循环。扫描循环,寻找最重的边缘(这可以再次选择原始边缘)。删除此边缘。如果您将执行许多边缘突变,可以通过使用Floyd-Warshall algorithm计算所有对最短路径来加速循环查找。然后,您可以通过最初离开新边缘找到周期中的所有边,并在其两个端点之间寻找MST中的最短路径(将只有一条此类路径)。

答案 1 :(得分:2)

除了线性时间算法,由j_random_hacker提出,你可以在本书中找到一个子线性算法:"Handbook of Data Structures and Applications"(第36章)或这些论文:Dynamic graphsMaintaining Minimum Spanning Trees in Dynamic Graphs

答案 2 :(得分:2)

您可以在结果相同的情况下稍微更改问题。

  1. 获取原始MST的结构,从每个顶点运行DFS 您可以在每个之间的树路径中获得最大加权边 顶点对。该步骤的复杂性为O(N ^ 2)
  2. 我们可以假设我们不是将一个边的权重改为w 将新边(u,v)添加到权重为w的原始MST中。该 添加边缘会在树上形成一个循环,我们应该剪切一条边 在循环上生成一个新的MST。显然我们只能这样做 将添加边缘与路径(a,b)中的最大边缘进行比较 这一步的复杂性是O(1)