确定是否存在有效的数字排列

时间:2013-09-18 10:55:34

标签: algorithm constraints permutation

我正在尝试创建一种算法,根据规则列表确定是否存在有效的数字排列。

我有n个节点和n个整数,每个节点都包含一个无法与之配对的整数列表,我的目标是确定是否可以将每个节点与一个整数。

目前,我最好的解决方案是尝试选择一个可以配对的数字和节点,从列表中删除它们,然后递归调用我的函数。

在最坏的情况下,这可以在阶乘时间内产生所有可能的排列。是否可以确定是否存在有效配对而不生成所有排列?

感谢您的帮助!

3 个答案:

答案 0 :(得分:2)

此问题将减少为最大二分匹配,您可以使用Ford - Fulkerson算法在O(nm)http://en.wikipedia.org/wiki/Ford%E2%80%93Fulkerson_algorithm中解决它。

这个想法是你可以创建一个顶点是n个整数和n个节点的图形,如果你可以使用那个整数来表示那个节点,那么从一个节点到一个整数将有一个有向边。 从您可以应用上述算法时,图表可以分为两组。

答案 1 :(得分:0)

除非您有关于如何生成那些“无法与之配对的整数列表”的详细信息,否则不会。 解决这类问题的方法是划分和征服算法:http://en.wikipedia.org/wiki/Divide_and_conquer_algorithm

答案 2 :(得分:0)

您也可以将其视为Assignment Problem

您可以为不希望分配的组合分配巨额成本,并为所有可行组合分配零成本。

最小化目标函数,如果结果大于零,则表示无法进行可行的分配。

可以应用标准匈牙利算法