先考虑一个暴力的DP:设(f_{i,j,S})表示点(i)映射到了图中的点(j),且点(i)所在子树的所有点映射到了图中的集合(S)时的映射方案数,转移暴力地枚举子集即可,复杂度(O(n^33^n))显然跑不过。
那么我们注意一下复杂度的瓶颈到底出现在了哪里,不难发现出现在了“树上的每一个点映射到的图上的点不能相同”这一个限制。如果没有这一个限制,不难发现一个(O(n^3))的DP:设(f_{i,j})表示点(i)映射到了图中的点(j)时的方案数,转移枚举儿子映射到的点考虑这两个点是否连边。
如果直接这样做显然会算重一些东西,也就是某一些点可能会映射到相同的点。我们是否可以通过某些方式减掉这个方案数?那么就不难想到容斥了。我们对于点集全集的每一个子集(T),每一次跑一边树形DP计算当树上的每一个点都只能映射到(T)点集中的点时的方案数,容斥系数是((-1)^{N - |T|})。这样我们以(O(2^nn^3))的复杂度完成了此题,虽然复杂度很不对但是就是能过……