Algorithm 找到跨越给定最小生成树的最小权重完整图
设T=(V,E)是一棵树,树上有Algorithm 找到跨越给定最小生成树的最小权重完整图,algorithm,graph,minimum-spanning-tree,Algorithm,Graph,Minimum Spanning Tree,设T=(V,E)是一棵树,树上有|V |顶点和|E |=| V-1 |边,代价已知。我们想要构造一个最小权完全图G=(V,E'),它跨越T作为它唯一的最小生成树 例子:考虑下面的树T边在红色< /强>中有一定的代价。将添加虚线边以从此树构建完整的图形 跨越T作为其唯一MST的最小权重完整图G如下所示: 我试图找到一个(多项式时间)算法来生成这个图。我主要是在寻找一个提示,而不是完整的解决方案。到目前为止,我设计了以下算法: 1) 找到包含最重的MST边(重量w_max)且没有其他MST边的
|V |
顶点和|E |=| V-1 |
边,代价已知。我们想要构造一个最小权完全图G=(V,E'),它跨越T作为它唯一的最小生成树
例子:考虑下面的树T边在<强>红色< /强>中有一定的代价。将添加虚线边以从此树构建完整的图形
跨越T作为其唯一MST的最小权重完整图G如下所示:我试图找到一个(多项式时间)算法来生成这个图。我主要是在寻找一个提示,而不是完整的解决方案。到目前为止,我设计了以下算法: 1) 找到包含最重的MST边(重量
w_max
)且没有其他MST边的图的切面。所有其他边缘必须为w_max+1
。以下图片说明了我的想法:
边(1--2)、(1--4)、(4--5)、(2--3)和(2--5)包含在该切割C中。MST中包含的唯一边是边(2--3),它是MST中最重的边,具有w=56
。因此,所有其他边应具有w=57
。证明:假设相反;我们可以用另一条边替换(2--3),并且仍然保持树的连接。现在树的重量较轻,因此(2-3)不属于MST。矛盾
2) 按重量递减顺序,对MST重量w_i
的所有其他边缘e_i
重复上述步骤。进行仅包含e_i
且不包含其他MST边的切割。此切割的任何未知非MST边缘的重量应为w_i+1
问题: 1) 上述算法正确吗?根据切割特性,应为 2) 我能做得更有效率吗?我没有一个算法来找到头顶上的伤口,但我觉得这种方法不太有效
编辑:我脑海中的另一种方法是基于Kruskal算法的方法: 1) 使用联合查找,我通过提升成本迭代所有MST边,并统一同一组件下的相应顶点 2) 在每一步中,两个不同的组成部分通过成本边缘统一起来。在同一(新)组件内形成循环的任何其他边的成本应为
w+1
回答我自己的问题
下面是我提出的一个有效答案,也是@sasha的反馈。
假设我们想要计算完整图G的总权重,即
设T=(V,E)是具有已知权重的| V |顶点和| E |=| V |-1边的树。计算跨越T作为其唯一最小生成树的最小权重完整图G=(V,E')的总权重w_total
。
注意:边权重是自然数
算法:
|V |
单例组件初始化联合查找T
的所有边进行排序。运行时间:O(| V |*log | V |)T
的下一条边e=(v1,v2)
。将其重量w_e
加到w_total
中v1
和v2
组件查找:set1
,set2
,分别包含size1
和size2
顶点G
是一个完整的图,因此将添加size1×size2
边:一条边是MSTe
边,所有其他边都必须比e
重,因此Kruskal的算法将忽略它们。因此,它们的最小重量应至少为w_e+1
w_total+=(size1×size2-1)×(w_e+1)
set1
和set2
e
重复步骤2
如果问题变成:详细列出完整图形的所有边
e=(v1,v2)
及其权重w
,我们只需在步骤6
和7
之间执行以下操作:
for all vertices v1 in set1
for all vertices v2 in set2
create edge e = (v1, v2); ignore if edge is the MST edge
w_e = w_mst_edge + 1
因此,运行时间变成O(| E |+| V |*log | V |)=O(| V |^2),因为我们有| E |=| V |*(| V |-1)/2条边,在完整的图
G
中,我无法正式地证明它,但似乎kruskal方法和你的切割方法是间接相同的,不确定你的切割算法是否有一个不好的复杂性,这是正确和有效的