有一点螺母要裂。我有算法的强力实现,这并不是真的那么难,但是显然我想要更有效的方法。
问题如下:
想象一下,您有 n 个数组,每个数组都填充了 1 和 n 之间的一些值。我需要确定是否可以从每个数组中选择一个元素,这样我就可以一次从 1 到 n 中选择每个元素。一个小例子:假设n = 4
,我们有以下n
数组:
[1,2,3,4]
[1,3]
[2,4]
[3,4]
这种数组组合将通过算法,因为有可能(例如)分别从每个数组中选择1、3、2、4。另一种可能性是2、1、4、3。 一个反例是:
[1,2,3]
[3]
[3,4]
[3,4]
在这里,您清楚地看到这些输入数组不会通过算法。不可能从每个数组中选择一个元素,而每个元素只能被选择一次。
就像我说的那样,暴力破解方法并不那么复杂,但是我想要一种更高效的方法,而无需经历所有可能的排列,直到找到通过标准的排列。
答案 0 :(得分:9)
此问题可以简化为Maximum Bipartite Matching,可以通过Ford-Fulkerson Algorithm for Maximum Flow Problem解决:
让我们创建一个2*n
节点的流程图,其中第一组n
节点代表数组,而下一组n
节点代表值。因此,当且仅当在数组i
内包含值j
时,第一个集合中的节点i
到第二个集合中的节点j
会有一条边。此边缘的容量应为1,表示您只能从每个阵列中选择一个。
形成此图后,应用经典算法找到答案。
对于问题中的示例:
[1,2,3,4]
[1,3]
[2,4]
[3,4]
我们可以形成这张图
白色节点代表数组,绿色节点代表值。