这是一个家庭作业问题,所以我很乐意接受提示。
我有一个图G,其中每个顶点v的权重为w(v)。
S(G)是图中所有顶点的权重之和。
我需要找到一种算法来确定是否存在一组顶点A,当G [A](由A引起的G图形)是树时,进行S(G [A])= S(g ^ [V \ A])。
我知道我应该遍历所有顶点,加总它们的权重,然后尝试找到一棵达到该总和的一半的树,但我不确定究竟是多少。我很确定它涉及动态编程。
非常感谢,
亚龙。
答案 0 :(得分:0)
这不是一个真正的动态编程问题,它是一个搜索问题,关键是你正试图找到一棵树。
如果您考虑一下,您已经知道一两个算法将告诉您最小生成树。通过相同的逻辑,您可以创建最大生成树。例如,如果您发现最大生成树及其权重之和小于50%(或无论目标值是什么),那么您就知道问题是不可能的。
因此,遵循这个逻辑,你可以像生成一棵生成树一样,拒绝任何超过目标金额的路径。这种策略被称为"分支和绑定"。让我们想象一下我们如何使用Kruskal算法做到这一点:
(1)你将拥有一组树;从每个顶点开始作为单独的"树"
(2)维护一个尚未使用的边缘队列,从最小到最大
排序(3)保持一堆已使用的边缘
(4)寻找一条边(a)连接两棵不同的树,(b)两棵树的总和小于(或等于目标值,即解决方案)
(4a)如果不存在这样的边缘,则从堆栈中弹出一个值(删除边缘并分离树)并尝试队列中的下一个值
(4b)如果存在这样的边缘,则添加边缘(将两棵树组合),将其推入堆叠并返回步骤4
显然,有不同的方法来做同样的过程。例如,您也可以使用Prim算法的变体。