Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 找到跨越给定最小生成树的最小权重完整图_Algorithm_Graph_Minimum Spanning Tree - Fatal编程技术网

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

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边的

设T=(V,E)是一棵树,树上有
|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
    边:一条边是MST
    e
    边,所有其他边都必须比
    e
    重,因此Kruskal的算法将忽略它们。因此,它们的最小重量应至少为
    w_e+1
  • w_total+=(size1×size2-1)×(w_e+1)
  • 统一两个组件
    set1
    set2
  • 对下一个MST边缘
    e
    重复步骤
    2
  • 运行时间: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 |=| V |*(| V |-1)/2条边,在完整的图
    G

    中,我无法正式地证明它,但似乎kruskal方法和你的切割方法是间接相同的,不确定你的切割算法是否有一个不好的复杂性,这是正确和有效的