用于查找最大对数的高效算法

时间:2015-04-10 15:03:01

标签: c++ algorithm

从一对数字列表中查找数字对的最快方法是什么,以便形成最大数量的对?

例如:我有6个数字:0,1,2,3,4,5

以下是有效对:

0 1
0 2
0 3
1 4
3 5

现在,一旦数字包含在一对中,该数字就不能包含在另一对中。

也就是说,如果我选择0 1对,我不能再选择0 2,因为我已经使用过0次。

我需要从有效对列表中选择对,以便获得最大对数。

根据示例:

如果我选择以下配对:

0 1
3 5

请注意,我只能选择这两对,这样就不会重复任何数字,剩下2和4。

但如果我选择以下配对:

0 2
1 4
3 5

我得到三对,没有数字是独自留下的。同样,从给定的列表中,我需要计算出我可以做出的最大对数。最有效的方法是什么?

2 个答案:

答案 0 :(得分:4)

使用Bloossom算法可以在多项式时间复杂度下解决这个问题: http://en.wikipedia.org/wiki/Blossom_algorithm

形成一个图形,其中每个数字都是节点,并用边连接每一对。在此图上运行上述算法以找到解决方案。

答案 1 :(得分:2)

因此,您的有效对可以表示为图形,然后最大对数是该图中的最大匹配。

请注意,您可以拥有多个解决方案。对于有效对[(0,1),(1,2),(2,3),(3,4)] [[0,1],(2,3)]和[(1,2), (3,4)]是解决方案。