Algorithm 如果删除一条边,如何从旧MST更新MST
我正在学习算法,我看过这样的练习 我可以用指数时间解决这个问题,但是。我不知道如何证明这个线性时间O(E+V)Algorithm 如果删除一条边,如何从旧MST更新MST,algorithm,graph,graph-theory,minimum-spanning-tree,Algorithm,Graph,Graph Theory,Minimum Spanning Tree,我正在学习算法,我看过这样的练习 我可以用指数时间解决这个问题,但是。我不知道如何证明这个线性时间O(E+V) 我将非常感谢您的帮助。当您删除其中一条边时,MST将分为两部分,我们将它们称为a和b,因此您可以做的是迭代零件a的所有顶点,并查找所有相邻边,如果任何边在零件a和零件b之间形成链接,则您已找到新的MST 伪代码: for(all vertices in part a){ u = current vertex; for(all adjacent edges of u){
我将非常感谢您的帮助。当您删除其中一条边时,MST将分为两部分,我们将它们称为
a
和b
,因此您可以做的是迭代零件a
的所有顶点,并查找所有相邻边,如果任何边在零件a
和零件b
之间形成链接,则您已找到新的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;
}
}
复杂性是O(V+E)
注意:您可以保留一个简单的数组来检查顶点是否位于MST的a部分或b部分
还要注意,为了获得O(V+E)复杂度,需要有图的邻接列表表示。假设在删除边后有图G'。G’由两个相连的部件组成
让图中的每个节点都有一个组件ID。根据节点所属的组件为所有节点设置componentID。这可以通过一个简单的BFS来实现,例如在G'上。这是一个O(V)操作,因为G'只有V节点和V-2边
标记所有节点后,迭代所有未使用的边,并找到连接两个组件的权重最小的边(两个节点的组件将不同)。这是一个O(E)操作
因此,总运行时间为O(V+E)。设G为嵌入最小生成树T的图;假设A和B是从T中移除(u,v)后剩下的两棵树
前提p:从重新连接A和B的G-(u,v)中选择最小权重边(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不包含(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都不存在,所以t'必须是MST。量化宽松
算法
遍历A并将其所有顶点涂成红色。类似地,将B的顶点标记为蓝色。现在遍历G-(u,v)的边列表,以找到连接红色顶点和蓝色顶点的最小权重边。新的MST是这条边加上A和B。可能重复了很好的解释,但我有一个问题,为什么“A'和B'分别跨越与A和B相同的顶点”而不是“A'和B'跨越与A和B相同的顶点”?@soulomoon Right。谢谢固定的。