Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.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_Dynamic Programming - Fatal编程技术网

Algorithm 诱导图的顶点和&动态规划

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。这不是一个真正的动态规划问题,它是一个搜索问题,关键是你正在试图找到一棵树 如果你仔细

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

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

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

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

我知道我应该检查所有的顶点,求它们的权重之和,然后试着找到一棵树,它能达到这个总和的一半,但我不确定具体如何。我很确定这涉及到动态规划

多谢各位


Yaron。

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

如果你仔细想想,你已经知道一两个算法,它会告诉你最小生成树。按照同样的逻辑,您可以生成一个最大生成树。例如,如果您发现最大生成树且其权重之和小于50%(或无论目标值是什么),则您知道问题是不可能的

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

(1) 你将拥有一套树木;从每个顶点作为单独的“树”开始

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

(3) 维护已使用的边的堆栈

(4) 查找(a)连接两棵不同树的边,以及(b)两棵树的总和小于(或等于目标值,即解决方案)的边

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

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


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

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