查找跨越给定最小生成树的最小权重完整图

时间:2015-01-05 01:01:08

标签: algorithm graph minimum-spanning-tree

T =(V,E)|V|个顶点和|E| = |V-1|边的树,具有已知成本。我们想要构建一个最小权重完整 G =(V,E'),它将 T 作为唯一的最小生成树。< / p>

示例:考虑以下树 T 红色中的边缘具有给定的成本。将添加虚线边缘以从该树构造完整的图形。

Tree

T 作为其唯一MST的最小权重完整图 G 如下:

Complete Graph


我正在尝试找到生成此图的(多项式时间)算法。我主要是寻求提示,而不是完整的解决方案。到目前为止,我已经设计了以下算法:

1)找到图形的切割,其中包括最重的MST边缘w_max,而没有其他MST边缘。所有其他边缘必须为w_max + 1。以下图片说明了我的想法:

Cut on the heaviest MST edge

边缘(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

1 个答案:

答案 0 :(得分:1)

回答我自己的问题

这是我提出的有效答案,也是@sasha的反馈。 假设我们想要计算完整图G的总权重,即

  

设T =(V,E)为| V |的树顶点和| E | = | V | -1边,具有已知权重。计算最小权重完全图G =(V,E&#39;)的总权重w_total,其中T作为其唯一的最小生成树。   注意:边缘权重是自然数。

算法:

  1. 使用|V|单例组件初始化Union-Find。
  2. 按权重递增T的所有边。运行时间:O(| V | * log | V |)。
  3. 迭代e = (v1,v2)的下一个边T。将其权重w_e添加到w_total
  4. 在联盟中查找v1v2个组件 - 查找:set1set2,其中包含size1和/ size2顶点。
  5. 这些组件将统一起来。由于G是一个完整的图表,因此会添加size1 × size2个边缘:一个边缘是MST e边缘,所有其他边缘都必须比e重,因此Kruskal&# 39; s算法会忽略它们。因此,它们的最小重量应至少为w_e + 1
  6. w_total += (size1 × size2 - 1) × (w_e + 1)
  7. 统一两个组件set1set2
  8. 从步骤2开始重复下一个MST边缘e
  9. 运行时间:O(| V | * log | V |)。


    如果问题变为:详细列出完整图表的所有边e = (v1, v2)及其权重w,我们只需执行步骤67之间的操作:

    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个边。