通过删除图中的节点可以形成的树数

时间:2015-09-05 13:16:37

标签: algorithm graph tree combinatorics counting

0
|
0__1__0
|  |  |
1__1__0
   |
   1

我们说我有一个无向图。我们有这些条件:

  1. 您只能删除标记为' 1'的节点。

  2. 删除任何节点都不能使图形成为林

  3. 我们可以删除多个节点,但必须满足上述条件。

    计算上述过程可以生成的不同树(无根)的数量。请注意,没有' root'这里。我们只计算不同的结构。

    对于上述情况,答案是4,因为:

    0
    |
    0     0
    |     |
    1__1__0        ------> #1
       |
       1
    
    0
    |
    0     0
    |     |        -------> #2
    1__1__0
    
    
    0
    |
    0__1__0
    |     |       ---------> #3
    1     0
    
    0
    |
    0__1__0       ---------> #4
          |
          0
    

    我希望得到任何帮助或提示。

    (如果图形已经是树,我们仍然可以删除节点以获取新树,但需遵守上述条件)

1 个答案:

答案 0 :(得分:1)

正如您已经指出的,一个天真的指数解决方案是获取1个节点的所有子集,并为每个子节点检查删除节点获得树图。两个想法如何修剪一些子集:

  1. 从最小到最大逐步构建1节点子集。如果你找到一个分区图表,你就不需要检查它的任何超集。
  2. 让我表示示例A,B,C,D中的1节点:

    0
    |
    0__A__0
    |  |  |
    C__B__0
       |
       D
    

    删除图表的{A, B}分区。因此,显然删除{A, B, C}{A, B, D}{A, B, C, D}也会对图表进行分区。您不需要明确检查其中任何一个。

    (除非其中一个分区图组件仅由1个节点组成。然后删除所有这些1节点组件也可以获得有效的解决方案。您可能需要将其作为特殊情况进行检查。)

    1. 找到获得树的1节点子集后;然后删除任何进一步的1节点也会获得一棵树,只要图形没有被分区。
    2. 例如,通过删除A我们得到一棵树:

      0
      |
      0     0
      |     |
      C__B__0
         |
         D
      

      我们可以通过删除更多节点来生成其他树。对于这些,我们只需要通过删除它们来检查我们不要对图表进行分区。如果没有,我们可以确定图形仍然是树。在此示例中删除D说明了这个想法。

      在最坏的情况下,这些优化可能不会使算法优于指数,但它们可以使其适用于相当小的输入。