最优选择选举算法



给定一组人(类似于):

[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的每个值来消除二进制搜索,并增强上次运行中获得的残差网络,而不是从头开始。然而,我决定解释二进制搜索版本,因为它在概念上更简单。

最新更新