我不知道如何写这个问题的标题。现有的标题可能不准确。
问题在于:
我有m
组(数组),比方说,4组。每组包含一些数字。我们希望的是每个组给出一个数字,并且总共产生的4个数字(每个来自一个组)是不同的。
现在给出这4组,我怎样才能确保它们符合我们的愿望呢?
例如,
A:0,2,3
B:0,2
C:2,3
D:1
以上4组可以满足我们的愿望。 D给出1,C给出3,B给出2,A给出0。
但是如果
A:2
B:2
C:2,3
D:1
很糟糕。我们不能让每个小组给出一个明确的数字。
我的想法是最愚蠢的方式,我只是回溯所有组中的所有元素,以获得元素的每个组合,并从一个组合中看到这些元素是不同的。
任何人都有更好的主意吗?
答案 0 :(得分:5)
您可以将此建模为网络流问题,然后在该问题域中使用快速算法(其中许多是多项式时间),如Edmunds-Karp或push-relabel。
创建源节点和汇聚节点。然后为每个“组”和每个不同的元素创建节点。将每个组节点连接到源,将每个元素节点连接到接收器。如果组作为元素,最后使用元素节点连接组节点。所有流量应为1。
最好用一个例子来说明。我将使用你给出的第一个例子:
A: 0, 2, 3
B: 0, 2
C: 2, 3
D: 1
将转入以下流量网络:
A 0
/ \
/ \
S--B 1--T
\ /|
\ / |
C 2 /
/
3
我无法绘制中间流程。但想象一下,A流向0,2,3,B流向0,2,C流向2,3,D流向1.所有流量均为单位容量。
首先在此图中找到max-flow。组和元素之间的流程将为您提供所需的二分匹配。
如果没有可能的匹配,则max-flow将小于组的数量。
答案 1 :(得分:2)
您想要的是http://en.wikipedia.org/wiki/Bipartite_graph,并且您可以申请http://en.wikipedia.org/wiki/Maximum_flow_problem#Maximum_cardinality_bipartite_matching。您可以使用以下名称找到算法:最大基数二分匹配或二分图上的最大流量。这里有很好的解释http://en.wikipedia.org/wiki/Maximum_matching和http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=maxFlow,http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=maxFlow2 希望有所帮助。
答案 2 :(得分:0)
一个想法是寻找所有组独有的元素,并将它们用于它们所属的组;这会将列表缩小到只有具有共同元素的组。
另一个想法是从具有最少元素的组(理想情况下是一个)开始,将它们设置为其中一个值并迭代增加大小(您可以在删除已使用的元素后考虑大小)。 / p>