从两组中的每一组中挑选一个元素

时间:2015-01-08 17:00:05

标签: algorithm

我们有很多人,比如P1P2P3P4。我们有两套。假设一组是{1, 2, 3, 4}而另一组是{A, B, C}。每个人都有一个他可以从两组中选择的元素列表。当一个人同时拥有两组中的两个元素时,我们说这个人已经准备好了。我们希望最大限度地提高准备人数。相同的元素不能使用两次。如下例所示:

People: P1, P2, P3, P4
Set1: {1, 2, 3, 4}
Set2: {A, B, C}

P1 can pick from {1, 2} and {B, C}
P2 can pick from {1, 2, 3} and {C}
P3 can pick from {1, 2} and {B, C}
P4 can pick from {1} and {A, B, C}

上述示例的一种可能解决方案是:

P1 picks none P2 picks 3 and C P3 picks 2 and B P4 picks 1 and A

考虑将贪婪分别用于每一组,但事实上为了获得最佳解决方案,一组的解决方案有时必须为另一组解决。

编辑: 最大流量解决方案解决了原始问题。现在,如果每个人在选择{1, 2, 3, 4}时都有自己的偏好怎么办?例如,P12更喜欢1。如果P1可以选择12,他将始终选择2

1 个答案:

答案 0 :(得分:4)

这可以通过计算如下构造的流网络上的最大流量来解决:

  • 构建源节点Source
  • 为第一组#1#4的元素构建一个节点;将每个节点连接到Source
  • 为每个人构建一个节点。根据其兼容性列表(即#1#4P1#1相关联,将每个人与#2 .. P2联系起来#1#2#3,依此类推)
  • 为第二组A中的每个元素构建一个节点。C。根据兼容性列表将每个节点连接到人员节点。
  • 构建一个节点Drain,并将A .. C中的每个节点连接到排水管。

所有边和所有顶点的容量均为1.以下是基于兼容性列表的说明:

MinCat / Max flow graph

现在在此图定义的流网络上运行several max flow algorithms之一。您获得的最大流量提供了最佳分配:

Flow diagram with flows