插入新边时更新最小生成树

时间:2010-04-20 23:50:39

标签: algorithm language-agnostic minimum-spanning-tree

我在大学时遇到过以下问题:

G =(V,E)成为(无向)图形,其边缘成本 c e > = 0 em> e ∈ E 。假设您在 G 中获得了最低成本生成树 T 。现在假设将一条新边添加到 G ,连接两个节点 v t v V ,费用为 c

  1. 提供一种有效的算法来测试 T 是否仍然是最小成本生成树,并将新边添加到 G (但不是 G / em>的)。使算法在时间O(| E |)中运行。你能在O(| V |)时间内完成吗?请注意您对用于表示树 T 和图表 G 的数据结构所做的任何假设。
  2. 假设 T 不再是最低成​​本生成树。给出线性时间算法(时间O(| E |))将树T更新为新的最小成本生成树。
  3. 这是我找到的解决方案:

    Let e1=(a,b) the new edge added
    Find in T the shortest path from a to b (BFS)
    if e1 is the most expensive edge in the cycle then T remains the MST
    else T is not the MST
    

    它似乎工作但我可以轻松地在O(| V |)时间运行,而问题要求O(| E |)时间。我错过了什么吗?

    顺便说一下,我们有权向任何人寻求帮助,所以我不会作弊:D

3 个答案:

答案 0 :(得分:8)

你有正确的想法,但如果以正确的方式存储树,你可以做比BFS更好的最短路径搜索。

假设 T 中的一个节点 r 是根(如果已在矩阵中标记了树边,则可以从那里选择任何节点和BFS来生成此结构或者邻接列表图结构),并且每个其他节点具有父指针和深度计数。要在 T 中找到 a b 之间的最短路径:

  1. a 成为“更深”的节点;如果需要,交换。
  2. 遍历来自 a 的父链接,直到达到 b r ,存储遍历的路径,标记已访问的节点。
  3. 如果您到达 b ,则会移动最短路径。
  4. 如果您到达 r ,那么也会从 b 遍历到根目录;如果您到达从 a r 的遍历中到达的节点,请停止。加入他们遇到的两个地方,你就可以在 T 中找到最短的路径。
  5. 该算法的有效性证明留给读者练习。这是像BFS一样的O(| V |),但通常也会更快。实际上,只有少数MST配置实际需要O(| V |)时间。当然,生成父链接树需要O(| V |)时间开始,所以这只在某些情况下有用,例如,如果您使用MST构建算法,在确定的过程中自然地创建此结构MST。

    正如另一位评论者所说,请注意,如果图表中有MST,则表示已连接,因此| V | < = | E |因此O(| V |)< O(| E |)。

    此外,要在O(| V |)时间内修复树,如果需要,只需找到循环中最长的边并将其移除,将其替换为新边。使用父链接MST有效地执行此操作也是读者的一项练习。

答案 1 :(得分:0)

我认为BFS就足够了。它的复杂性是O(| V | + | E |),但在树| E |中小于| V |所以O(2 | V |)就是O(| V |)

答案 2 :(得分:-1)

我相信您的步骤Find in T the shortest path from a to b是订单E操作。