C++ 求最大对数的有效算法
从数字对列表中找到数字对的最快方法是什么,以形成最大数量的数字对 例如:我有6个数字:0、1、2、3、4、5 以下是有效对:C++ 求最大对数的有效算法,c++,algorithm,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 0 2 1 4 3 5 请注意,我只能选择这两对,这样就不会重复任何数字,只剩下2和4 但
0 1
0 2
0 3
1 4
3 5
现在,一旦一个数字包含在一对中,该数字就不能包含在另一对中
也就是说,如果我选择了对0 1,我将无法再次选择0 2,因为我已经使用过一次0
我需要从有效对列表中选择对,以便获得最大对数
如示例所示:
如果我选择以下几对:
0 1
3 5
0 2
1 4
3 5
请注意,我只能选择这两对,这样就不会重复任何数字,只剩下2和4
但如果我选择以下几对:
0 1
3 5
0 2
1 4
3 5
我有三双,没有一双是单独留下的。类似地,从给定的列表中,我需要计算我可以生成的最大对数。最有效的方法是什么 因此您的有效对可以表示为一个图,然后最大对数就是该图中的最大匹配数
请注意,您可以有多个解决方案。对于有效对[(0,1),(1,2),(2,3),(3,4)],[(0,1),(2,3)]和[(1,2),(3,4)]都是解。可以使用Bloossom算法以多项式时间复杂度解决此问题:
形成一个图形,其中每个数字都是节点,并用边连接每一对。在此图上运行上述算法以找到解决方案。此问题闻起来像NP难问题。。有人能证实吗?这是顶点覆盖问题的一种变体吗?@vincentleest肯定。@vincentleest:看起来像是P中的。为什么
(0,4)
,(0,5)
,(2,4)
,(1,5)
,(2,5)
不是有效的对?或者你只是得到了一个对的列表,你需要选择一个最大子集吗?@BillLynch:在边的列表中(如果你将这些对视为边),你需要生成边数最大的子集,你是说用DFS计算最长路径?@bayblade567:一个简单的贪婪算法就足够了。。。看……最大匹配和最大匹配是有区别的。@riko,你说得对。丽子:嗯,的确,读得太快了,而且分享了两个错误的。。。很抱歉