设 T =(V,E)是|V|
个顶点和|E| = |V-1|
边的树,具有已知成本。我们想要构建一个最小权重完整图 G =(V,E'),它将 T 作为唯一的最小生成树。< / p>
示例:考虑以下树 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)重量为e_i
的MST的所有其他边w_i
,重量减少。进行仅包含e_i
而不包含其他MST边缘的剪切。此切割的任何未知的非MST边缘应具有w_i + 1
的权重。
问题:
1)上述算法是否正确?根据Cut属性,它应该是。
2)我可以更有效地做到吗?我没有算法在我的头顶找到削减,但我觉得这种方法效率不高。
编辑:我想到的另一种方法是基于Kruskal算法的方法:
1)使用Union-Find,我按升序成本迭代所有MST边,并统一同一组件下的相应顶点。
2)在每个步骤中,两个不同的组件通过成本w
的边缘统一。在同一(新)组件中形成循环的任何其他边缘的成本应为w+1
。
答案 0 :(得分:1)
回答我自己的问题
这是我提出的有效答案,也是@sasha的反馈。 假设我们想要计算完整图G的总权重,即
设T =(V,E)为| V |的树顶点和| E | = | V | -1边,具有已知权重。计算最小权重完全图G =(V,E&#39;)的总权重
w_total
,其中T作为其唯一的最小生成树。 注意:边缘权重是自然数。
算法:
|V|
单例组件初始化Union-Find。T
的所有边。运行时间:O(| V | * log | V |)。e = (v1,v2)
的下一个边T
。将其权重w_e
添加到w_total
。v1
和v2
个组件 - 查找:set1
,set2
,其中包含size1
和/ size2
顶点。G
是一个完整的图表,因此会添加size1 × size2
个边缘:一个边缘是MST e
边缘,所有其他边缘都必须比e
重,因此Kruskal&# 39; s算法会忽略它们。因此,它们的最小重量应至少为w_e + 1
。w_total += (size1 × size2 - 1) × (w_e + 1)
。set1
和set2
。2
开始重复下一个MST边缘e
。运行时间:O(| V | * log | V |)。
如果问题变为:详细列出完整图表的所有边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 |完整图G
中的= | V | *(| V | -1)/ 2个边。