我正在研究算法,我看过这样的练习
我可以用指数时间克服这个问题但是。我不知道如何证明这个线性时间O(E + V)
我将不胜感激。
答案 0 :(得分:3)
设G是嵌入最小生成树T的图形;让A和B成为(u,v)从T中移除后剩余的两棵树。
前提P:从G - (u,v)中选择重新连接A和B的最小权重边(x,y)。然后T' = A + B +(x,y)是G - (u,v)的MST。
P的证明:显然T'是一棵树。假设它不是最小的。然后会有一个MST - 称之为M - 重量较轻。并且M包含(x,y),或者它不包含。
如果M包含(x,y),那么它必须具有形式A' + B' +(x,y)其中A'和B'是最小权重树,它们跨越与A和B相同的顶点。这些树的重量不能小于A和B,否则T不会是MST。所以M不小于T'毕竟是一个矛盾; M不存在。
如果M不包含(x,y),则在M中从x到y存在一些其他路径P.P的一个或多个边从A中的顶点传递到B中的另一个。调用这样的边c 。现在,c的权重至少是(x,y)的权重,否则我们会选择它而不是(x,y)来形成T'。注意P +(x,y)是一个循环。因此,M - c +(x,y)也是生成树。如果c的权重大于(x,y),那么这棵新树的权重将小于M.这与M是MST的假设相矛盾。 M再也不存在了。
因为在任何一种情况下,M都不存在,T'必须是MST。 QED
<强>算法强> 遍历A并将其所有顶点着色为红色。类似地,标签B的顶点为蓝色。现在遍历G - (u,v)的边缘列表,找到连接红色顶点和蓝色的最小权重边。新的MST是这个边缘加上A和B.
答案 1 :(得分:1)
当你删除其中一条边时,MST会分成两部分,让我们称它们为a
和b
,所以你可以做的是遍历部分{{1}的所有顶点并查找所有相邻边,如果任何边形成了部件a
和部件a
之间的链接,则找到新的MST。
伪代码:
b
复杂性是O(V + E)
注意:您可以保留一个简单的数组来检查顶点是否在MST或for(all vertices in part a){
u = current vertex;
for(all adjacent edges of u){
v = adjacent vertex of u for the current edge
if(u and v belong to different part of the MST) found new MST;
}
}
部分的a
部分。
另请注意,为了获得O(V + E)复杂度,您需要具有图表的邻接列表表示。
答案 2 :(得分:0)
假设您在删除边缘后有图表G'。 G'包含两个连接的组件。
让图中的每个节点都有一个componentID。根据所属节点所属的组件设置所有节点的componentID。这可以通过简单的BFS来完成,例如在G'上。这是O(V)操作,因为G'只有V节点和V-2边缘。
一旦所有节点都被标记,迭代所有未使用的边缘并找到连接两个组件的权重最小的节点(两个节点的componentID将不同)。这是O(E)操作。
因此总运行时间为O(V + E)。