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_Flow - Fatal编程技术网

Algorithm 最优选择算法

Algorithm 最优选择算法,algorithm,flow,Algorithm,Flow,考虑到一群类似的人: [p1,p2,p3] [p2,p3] [p1] [p1] 从每组中选择1,尽量减少选择任何一个人的最大次数 对于上述集合,必须选择给定人员的最大次数为2次 我正在努力找到一个算法。我不认为用贪婪算法就可以做到这一点,更多的是按照动态规划解决方案的思路思考 有什么关于如何进行的提示吗?或者你们中有谁知道关于这些东西的好网站,我可以看看吗?这既不是动态的,也不是贪婪的。让我们先看一个不同的问题——最多选择一次每个人可以吗 你有p个人和S组。创建具有S+P顶点的图,表示集合和人

考虑到一群类似的人:

[p1,p2,p3]
[p2,p3]
[p1]
[p1]
从每组中选择1,尽量减少选择任何一个人的最大次数

对于上述集合,必须选择给定人员的最大次数为2次

我正在努力找到一个算法。我不认为用贪婪算法就可以做到这一点,更多的是按照动态规划解决方案的思路思考


有什么关于如何进行的提示吗?或者你们中有谁知道关于这些东西的好网站,我可以看看吗?

这既不是动态的,也不是贪婪的。让我们先看一个不同的问题——最多选择一次每个人可以吗

你有p个人和S组。创建具有S+P顶点的图,表示集合和人员。当pi是si的一个元素时,人pi和集合si之间有一条边。这是一个问题,您的问题的决策版本相当于测试该图中的是否有大小S

如该页所述,这个问题可以通过使用算法来解决。注意:如果你不知道我在说什么,那么现在就花点时间阅读,因为你不会理解其他内容:首先创建一个超级源,添加一条边,将其链接到所有具有1个容量的人,表示每个人只能使用一次,然后创建一个超级接收器并添加边,将每个集链接到该接收器,容量为1表示每个集只能使用一次,并在源和接收器之间运行合适的最大流算法

现在,让我们考虑一个稍微不同的问题:是否可以通过选择最多k次的每个人来完成?

如果您注意到最后一段中的备注,您应该知道答案:只需更改离开超级源的边的容量,以表明在这种情况下每个人可以使用多次

因此,您现在有了一个算法来解决决策问题,其中最多选择k次的人。很容易看出,如果你可以用k来做,那么你也可以用任何大于k的值来做,也就是说,这是一个单调函数。因此,您可以在问题的决策版本上运行二进制搜索,查找仍然有效的最小k


注意:您还可以通过顺序测试k的每个值,并增加在上一次运行中获得的剩余网络(而不是从头开始)来摆脱二进制搜索。然而,我决定解释二进制搜索版本,因为它在概念上更简单。

对如何解决最大流算法有一个简单的想法。要从上述模型中的一个集合中选择一个人,您可以使用DFS找到从超级源到超级接收器的路径,其最小边缘容量>=1。如果你能找到这样一条路径,只需将集合和路径上的人之间的边的容量减少一个,这相当于我们使用一个单位的容量。