将新边缘插入到最小生成树

时间:2016-01-07 20:03:33

标签: graph-algorithm minimum-spanning-tree

我尝试使用一个不同的方法找到以下问题的算法: 边缘不明显。

提供一种有效的算法来测试T是否仍然是新的边缘添加到G的最小成本生成树。

在这个链接中 - 有一个解决方案,但它不是我写的不同: 边缘不是很明显。

Updating a Minimum spanning tree when a new edge is inserted

有人有个主意吗?

2 个答案:

答案 0 :(得分:0)

嗯,只是使用Prim或Kruskal找到新图的最小成本生成树然后看哪一个总成本较低的天真方法在O(| E | log | E |)

但我们不需要查看整个图表。

假设你的新边连接顶点A和B.假设C是A的父节点。如果B不是A的后代,那么如果AB的成本低于AC,那么T不再是MST而B应该是以A为根的子树的新父级。

如果B是A的后代,那么如果AB比从A到B的路径中的T中的任何分支短,则T不再是MST,并且应该删除沿该路径的最高成本边缘,B是新断开连接的组件的根,应该作为A的子项添加。

我相信你可能需要再次检查这些东西,反转哪个顶点是A和B.这个的复杂性是log | V |其中log的基数是T的每个节点的平均子节点数。在T是直线的情况下,它是O(| V |),但除此之外,我想你可以说它是O (日志| V |)。

答案 1 :(得分:0)

首先使用现有的一种有效算法找到MST。

现在添加边(v,w)会在MST中创建一个循环。如果新添加的边缘在循环中的边缘中具有最大成本,则MST保持原样。如果循环中的某些其他边缘具有最大成本,那么要删除边缘以获得具有较低成本的树。

因此,我们需要一种有效的方法来查找循环中具有最大值的边。您可以从vw爬升,直至到达LCA(v, w)vw的最不常见的祖先),以获得最高费用的优势。在最坏的情况下,这需要线性时间。

如果您要回答多个此类查询,那么预处理MST可能会更好。您可以预处理MST以在O(N lg N)时间内获取稀疏表数据结构,然后在最坏的情况下使用此数据结构在O(lg N)时间内回答最大查询。