1 条题解
-
0
题目大意
给定一个 个点的原图(不一定是树)和一个 个点的树形现图,求将现图的节点一一映射到原图的节点的方案数,使得现图中每条边在原图中对应节点之间也有边相连。
数据范围
,原图边数
算法思路
1. 问题转化
我们要找的是双射 ,使得对于现图的每条边 ,在原图中 也是一条边。
这是一个树同构嵌入图的计数问题。
2. 核心 DP 状态设计
设: 表示将现图中以 为根的子树映射到原图的节点集合 ,且 映射到原图节点 的方案数。
其中:
:现图的节点
:原图的节点
:原图节点的子集,
3. 状态转移
对于 的一个子节点 ,假设 映射到原图节点 ,并且 子树映射到原图节点集合 ,且 ,。
转移条件:
原图中 与 有边相连(因为 是现图的边)。
是 的子集,且 。
4. 实现细节
预处理每个节点数对应的所有子集 v2[k][s] 表示大小为 的集合中大小为 的子集。
预处理每个原图节点的邻居表 v3。
使用 to[] 数组快速取最低位的节点编号。
使用 nm[] 数组快速计算二进制中 1 的个数(即子集大小)。
5. 时间复杂度
状态数:
转移时枚举子集: 级别
总复杂度约 ,在 时可过。
- 1
信息
- ID
- 3194
- 时间
- 3000ms
- 内存
- 512MiB
- 难度
- 10
- 标签
- 递交数
- 3
- 已通过
- 1
- 上传者