task
给出一棵树的点的数量n,和部分边的数量,以及一个q,q表示给出q个三元组(a,b,c),满足lca(a,b)=c,求满足这样条件并以1为根的树共有几种。
$1<=n<=15$
$0<=m<n$
$1<=q<=100$
solution
这题既然问的是方案数,那么不是搜索就是dp了。搜索显然不可能,那么就是dp了。
由于n最多也就是15个点,所以我们可以用状压dp。
$dp[x][s]$表示第x个节点为根的子树中点的状况为s的最多方案数。
我们可以用递归的方式来写。
每次从原状态s中找到一个子集i,然后判断这个子集能否从s中分离,判断条件如下:
- 在子集i中是否有两个点的lca是x或者有两个点已经与x有一条边,若是则不行。
- 是否有两个点分别属于i与$s^i$但是它们的lca并不是x,或是他们之间有一条边,若是则不行。
如果成立我们从s中枚举一个子树的根j。当然我们需要判断此点是否可以作为子树的根。判断条件如下:
- 在子集i中是否有一个点与j的lca不是j,若是则不行。
- 在子集i中是否有另外一个点与x已有边,若是则不行。
如果成立,那么说明此点可以作为子树的根,那么我们就可以转移了。
为什么要相乘呢?因为这两部分可以作为同一棵树的两个部分,是相关,如果一个部分无解,那么就算另一个部分方案数再大也无济于事。
最后要注意两个情况:
- 转移是要保证$i<s^i$,这样可以完美的杜绝重复状况。
- 记得开long long。
Code
1 |
|