洛谷 P3349

给定一个有 \(n\) 个节点的树和一个有 \(n\) 个节点 \(m\) 条边的图。

问有多少个对应关系 \(p\) 满足:

  • \(p\) 是排列。
  • \((u, v)\) 这条边在树上,则 \((p_u, p_v)\) 在图上。

\(n \le 17\)

如果直接考虑状压 DP 的话,因为要合并子树,怎么做都需要一个 \(3^n\),还需要记录子树根节点是啥,时间复杂度是 \(O(n^33^n)\),TLE。

接下的做法十分神奇,没做过几乎想不出来。

换个视角:\(p\) 是排列等价于所有 \(i\) 都在 \(p\) 中出现过。这玩意看起来就很能容斥。

具体地我们考虑一个 \(\{1, 2, \dots , n\}\) 的子集 \(S\)\(p_i\) 只能是 \(S\) 中的元素,令 \(dp_{u, i}\) 表示 \(p_u = i\)\(u\) 子树内的方案数。那么转移时是:

\[dp_{u, i} = \prod\limits_{v \in son_u} (\sum\limits_{(i, j) \in E} dp_{v, j}) \]

\(i, j\) 只能是 \(S\) 内的元素,\(S\) 的贡献是 \((-1)^{n - |S|} \sum dp_{1, i}\)

时间复杂度:\(O(n^32^n)\)

这个题巧妙地转换了一下角度,DP 不记录用过了哪些数,而是通过 容斥 钦定只能使用那些数,从而避免合并子树,做到 \(O(n^32^n)\) 的复杂度。

似乎容斥时的 DP 值可能炸 long long 但是这个题没卡。因为答案是在 long long 范围内的,可以使用 ull

posted @ 2025-11-11 21:52  xiehanrui0817  阅读(0)  评论(0)    收藏  举报