我们有很多人,比如P1
,P2
,P3
,P4
。我们有两套。假设一组是{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}
时都有自己的偏好怎么办?例如,P1
比2
更喜欢1
。如果P1
可以选择1
或2
,他将始终选择2
。
答案 0 :(得分:4)
这可以通过计算如下构造的流网络上的最大流量来解决:
Source
#1
到#4
的元素构建一个节点;将每个节点连接到Source
。#1
与#4
和P1
,#1
相关联,将每个人与#2
.. P2
联系起来#1
,#2
和#3
,依此类推)A
中的每个元素构建一个节点。C
。根据兼容性列表将每个节点连接到人员节点。Drain
,并将A
.. C
中的每个节点连接到排水管。所有边和所有顶点的容量均为1.以下是基于兼容性列表的说明:
现在在此图定义的流网络上运行several max flow algorithms之一。您获得的最大流量提供了最佳分配: