您如何确定图G是否具有权重为k的生成树?

时间:2019-02-20 18:18:45

标签: algorithm tree

给定k,一个正整数和一个连通图G =(V,E),E的每个e具有权重w(e),谁能提出一种算法来确定G是否具有一个重量k?

1 个答案:

答案 0 :(得分:3)

您的问题很难解决。我们可以通过简化the subset sum problem的公式来证明这一点:

  

给出[…]自然数 w 1 ,…, w n ,它们的任何子集的总和是否恰好是 W

假设我们有一种可以解决您的问题的算法。然后,我们可以通过创建包含以下内容的图 G 来解决子集和的问题(在上面的公式中):

  • 顶点 v 1 ,…, v n 集合,再加上两个特殊顶点 x y
  • x 到每个 v i 的边缘,权重为 w i
  • y 到每个 v i 的一条边,权重为0。
  • x y 的边,权重为0。

当且仅当您的算法为图 G k = < em> W 。

了解原因:

  • 如果您的算法返回“是”,则存在权重为 W 的生成树,这意味着生成树中的边加起来为 W 。但是非零边缘权重是集合中所有不同的元素,因此这意味着我们有一个总和为 W 的子集。
  • 相反,如果有一个子集的总和为 W ,那么我们可以通过取 x 的边来构造权重为 W 的生成树。 em>对应于该子集的顶点,再加上 y 到所有其他顶点的(零权重)边,再加上 x 到所有其他顶点的(零权重)边 y

当然,NP硬度并不意味着您无法做到。这只是意味着,对于所有可能的输入,没有一种正确的有效算法。

一种低效算法将生成所有可能的生成树,并查看其中是否有正确的权重。

您还可以更有效地检查一些可能的情况;特别是,您可以使用Kruskal's algorithm查找最小生成树,并(稍作修改)使用查找最大生成树。这样,您便可以快速消除可能的生成树权重范围之外的任何 k

消除 k 的许多值的另一种可能方法是使用一些算法解决子集和问题(在我上面链接的Wikipedia文章上),以确定图是否具有任何权重为 k 的子图。