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

Algorithm 确定是否存在有效的数字排列,algorithm,constraints,permutation,Algorithm,Constraints,Permutation,我试图创建一个算法,根据一系列规则确定是否存在有效的数字排列 我有n节点和n整数,每个节点都包含一个无法配对的整数列表,我的目标是确定是否可以将每个节点与一个整数配对 目前,我的最佳解决方案是尝试选择一个可以配对的号码和节点,将它们从列表中删除,然后递归调用我的函数 在最坏的情况下,这可能会在阶乘时间内产生所有可能的排列。是否可以在不生成所有置换的情况下确定是否存在有效配对 谢谢你的帮助 除非您有关于如何生成这些“不能与之配对的整数列表”的更多详细信息,否则不会。 这类问题的解决方案是分治算法:

我试图创建一个算法,根据一系列规则确定是否存在有效的数字排列

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

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

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


谢谢你的帮助

除非您有关于如何生成这些“不能与之配对的整数列表”的更多详细信息,否则不会。
这类问题的解决方案是分治算法:

此问题将被简化为最大二部匹配,您可以使用Ford-Fulkerson算法在O(nm)内解决它

其思想是,您可以创建一个顶点为n个整数和n个节点的图,如果您可以使用该整数表示该节点,则将有一条从一个节点到一个整数的有向边。
当您可以应用上述算法时,可以将图形分为两组。

您也可以将其视为一组

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

最小化目标函数,如果结果大于零,则意味着不可能进行可行分配


可以应用标准匈牙利算法

您能更详细地解释一下这种简化是如何工作的吗?我认为你是对的,但我不能根据这个答案+1。@Heuster:编辑一下,为了完全理解,你应该学习最大二部匹配,但基本思想是当你可以将一个图分成两个集合a和B时,集合a中的每个顶点都没有到集合a中另一个顶点的直边,反之亦然,我们可以有一个算法来匹配从集合A到集合B的每个项目。这类似于作业匹配的问题:染料,我理解减少。但你也需要一个源和汇,对吗?从源到每个节点应有一条定向边,从每个整数到汇应有一条定向边。所有边的容量都为1,那么,最大流将提供最大的二部匹配。@Heuster您是对的。实际上,有两种算法可以做到这一点,一种是我在上面发布的算法,另一种是你甚至不需要添加源和汇的算法,它叫做增广路径算法:D