0
|
0__1__0
| | |
1__1__0
|
1
我们说我有一个无向图。我们有这些条件:
您只能删除标记为' 1'的节点。
删除任何节点都不能使图形成为林
我们可以删除多个节点,但必须满足上述条件。
计算上述过程可以生成的不同树(无根)的数量。请注意,没有' 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
我希望得到任何帮助或提示。
(如果图形已经是树,我们仍然可以删除节点以获取新树,但需遵守上述条件)
答案 0 :(得分:1)
正如您已经指出的,一个天真的指数解决方案是获取1个节点的所有子集,并为每个子节点检查删除节点获得树图。两个想法如何修剪一些子集:
让我表示示例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节点组件也可以获得有效的解决方案。您可能需要将其作为特殊情况进行检查。)
例如,通过删除A
我们得到一棵树:
0
|
0 0
| |
C__B__0
|
D
我们可以通过删除更多节点来生成其他树。对于这些,我们只需要通过删除它们来检查我们不要对图表进行分区。如果没有,我们可以确定图形仍然是树。在此示例中删除D
说明了这个想法。
在最坏的情况下,这些优化可能不会使算法优于指数,但它们可以使其适用于相当小的输入。