Algorithm 诱导图的顶点和&动态规划
这是一个家庭作业问题,所以我很乐意得到一个提示 我有一个图G,其中每个顶点v都有一个权重w(v) S(G)是图中所有顶点的权重之和 我需要找到一个算法来确定是否有一组顶点a,当G[a](由a诱导的G图)是一棵树时,它执行s(G[a])=s(G[V\a]) 我知道我应该检查所有的顶点,求它们的权重之和,然后试着找到一棵树,它能达到这个总和的一半,但我不确定具体如何。我很确定这涉及到动态规划 多谢各位Algorithm 诱导图的顶点和&动态规划,algorithm,graph,dynamic-programming,Algorithm,Graph,Dynamic Programming,这是一个家庭作业问题,所以我很乐意得到一个提示 我有一个图G,其中每个顶点v都有一个权重w(v) S(G)是图中所有顶点的权重之和 我需要找到一个算法来确定是否有一组顶点a,当G[a](由a诱导的G图)是一棵树时,它执行s(G[a])=s(G[V\a]) 我知道我应该检查所有的顶点,求它们的权重之和,然后试着找到一棵树,它能达到这个总和的一半,但我不确定具体如何。我很确定这涉及到动态规划 多谢各位 Yaron。这不是一个真正的动态规划问题,它是一个搜索问题,关键是你正在试图找到一棵树 如果你仔细
Yaron。这不是一个真正的动态规划问题,它是一个搜索问题,关键是你正在试图找到一棵树 如果你仔细想想,你已经知道一两个算法,它会告诉你最小生成树。按照同样的逻辑,您可以生成一个最大生成树。例如,如果您发现最大生成树且其权重之和小于50%(或无论目标值是什么),则您知道问题是不可能的 因此,按照这个逻辑,您可以像创建生成树一样继续,并拒绝超过目标数量的任何路径。这种策略被称为“分支绑定”。让我们想象一下,我们如何使用Kruskal的算法来实现这一点: (1) 你将拥有一套树木;从每个顶点作为单独的“树”开始 (2) 维护尚未使用的边的队列,从最小到最大排序 (3) 维护已使用的边的堆栈 (4) 查找(a)连接两棵不同树的边,以及(b)两棵树的总和小于(或等于目标值,即解决方案)的边 (4a)如果不存在这样的边,则从堆栈中弹出一个值(删除边并分离树),然后尝试队列中的下一个值 (4b)如果确实存在这样的边,则添加边(合并两棵树),将其推到堆栈上,然后返回步骤4
显然,有不同的方法来完成相同的过程。例如,您也可以使用Prim算法的一种变体。所需的复杂性如何?@Herokiller没有。虽然,我认为这是动态规划,所以我试着考虑o(N^2)或类似的复杂性。