【问题标题】:Sum of Vertices in Induced Graph - Dynamic Programming诱导图中的顶点和 - 动态规划
【发布时间】:2014-06-13 06:12:37
【问题描述】:

这是一个家庭作业问题,所以我很乐意得到提示。

我有一个图 G,其中每个顶点 v 都有一个权重 w(v)。

S(G)是图中所有顶点的权重之和。

我需要找到一个算法来确定是否存在一组顶点 A,当 G[A](由 A 诱导的 G 的图)是一棵树时,执行 S(G[A])=S(G[ V\A])。

我知道我应该遍历所有顶点,将它们的权重相加,然后尝试找到一棵达到该总和一半的树,但我不确定如何准确。我很确定它涉及动态编程。

非常感谢,

亚龙。

【问题讨论】:

  • 所需的复杂性如何?
  • @Herokiller 没有。虽然,我认为这是动态编程,所以我正在尝试考虑 o(N^2) 或类似的复杂性。

标签: algorithm graph dynamic-programming


【解决方案1】:

这不是一个真正的动态规划问题,它是一个搜索问题,关键是你试图找到一棵树。

如果你仔细想想,你已经知道一两个算法会告诉你最小生成树。通过同样的逻辑,您可以制作最大生成树。例如,如果您找到最大生成树并且其权重之和小于 50%(或任何目标值),那么您就知道这个问题是不可能的。

因此,按照这个逻辑,您可以像制作生成树一样继续前进,并拒绝任何超过目标数量的路径。这种策略被称为“分支和绑定”。让我们想象一下我们如何使用 Kruskal 算法做到这一点:

(1) 你会有一组树;从每个顶点开始作为单独的“树”

(2) 维护一个尚未使用的边缘队列,从最小到最大排序

(3) 维护一堆你用过的边

(4)寻找一条边(a)连接两棵不同的树,(b)两棵树的和小于(或等于目标值,即解)

(4a) 如果不存在这样的边,则从堆栈中弹出一个值(移除边并分离树)并尝试队列中的下一个值

(4b) 如果确实存在这样的边,则添加边(合并两棵树),将其压入堆栈并返回步骤 4

显然有不同的方法来执行相同的过程。例如,您也可以使用 Prim 算法的变体。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-19
    • 2012-04-26
    • 2010-12-21
    • 1970-01-01
    • 2017-06-23
    相关资源
    最近更新 更多