派对上有N个人。每个人都有一些食物和饮料的偏好。鉴于特定人喜欢的所有类型的食物和饮料,找到可以分配饮料的最大数量和他们选择的食物。
一个人可能对食物和饮料有多种选择,例如,一个人可能喜欢食物A,B,C和饮料X,Y,Z。如果我们将(A,Z)分配给该人,我们认为该人已被正确分配。
我们如何解决这个问题,考虑到我们需要处理2个约束。
答案 0 :(得分:1)
让F成为所有食物的集合,D是所有饮料的集合,P是所有人的集合。
构建2个二分图G和G',使得:对于G:第一个分别为P,第二个分别为F,对于G':第一个分别为P,第二个分别为D.分别在G和G'上进行最大匹配。调用M G和M'上的最大匹配G'上的最大匹配。 M是顶点对的列表:(p1,f1),(p2,f2)...其中pi和fi分别是人和食物。 M'也是顶点对的列表:(p1,d1),(p3,d3)...
现在,通过将该对与同一个人合并来合并M和M':( p1,f1)+(p1,d1)=(p1,f1,d1),这是p1的食物 - 饮料组合。假设p2与f2匹配但p2在G'中没有匹配(没有饮料),则忽略它。
二分图匹配的一个好算法是Hopcroft-Karp算法。 http://en.wikipedia.org/wiki/Hopcroft%E2%80%93Karp_algorithm