如何测试树在线性时间内是否具有完美匹配?

时间:2009-04-23 15:21:14

标签: algorithm tree

给出线性时间算法来测试树是否具有完美匹配, 也就是说,一组边缘恰好接触树的每个椎骨。

这是来自S. Dasgupta的算法,我似乎无法解决这个问题。我知道我需要以某种方式使用贪婪的方法,但我无法弄清楚这一点。救命?

伪代码很好;一旦我有了这个想法,我就可以用任何语言轻松实现。

算法必须是线性的。 O(V + E)没问题。

5 个答案:

答案 0 :(得分:7)

我想我有解决方案。由于我们知道图是,我们知道叶子节点的存在,具有一个边缘且没有子节点的节点。为了使该节点包含在完美匹配中,该边缘必须存在于最终解决方案中。

因此,我们可以找到连接到叶节点的所有边,添加到解决方案中,并从图中移除触摸的边。如果在此过程结束时,我们留下任何剩余的节点未被调用,则不存在完美匹配。

答案 1 :(得分:1)

在“图表”的情况下, 问题的第一步应该是找到连接的组件。

由于最终答案中的每个边都连接两个顶点,因此它们至多属于一个连接的组件。

然后,可以找到每个连接组件的完美匹配。

答案 2 :(得分:0)

线性的什么?边数为线性,将边保持为有序入射列表,即每条边( v i v j )总排序。然后,您可以比较边缘的O( n )中的两个列表。

答案 3 :(得分:0)

有效的算法如下:

For each leaf in the tree: 
  add edge from leaf to its parent to the solution
  delete edge from leaf to its parent
  delete all edges from the parent to any other vertices
  delete leaf and parent from the tree

If the tree is empty then the answer is yes. Otherwise, there's no perfect matching.

答案 4 :(得分:-1)

我认为这是在图中找到哈密尔顿路径的简化问题: http://en.wikipedia.org/wiki/Hamiltonian_path

http://en.wikipedia.org/wiki/Hamiltonian_path_problem

我认为互联网上有很多解决这个问题的方法,但一般来说找到Hamilton循环是一个NP问题。