2021 ICPC沈阳 L.Perfect Matchings(树形dp+容斥原理)
Posted lwz_159
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021 ICPC沈阳 L.Perfect Matchings(树形dp+容斥原理)相关的知识,希望对你有一定的参考价值。
题目描述
题目大意
给你一个2n个点的完全图,从这个图里面删除2n−1条边,这些边形成一颗树,问剩下的图里面点进行完美匹配有多少种方案?
题目分析
本 题 我 们 要 对 一 个 完 全 图 选 匹 配 边 , 而 有 一 些 边 不 能 选 择 ( 2 n − 1 条 边 ) , 我 们 可 以 先 算 出 包 含 这 2 n − 1 条 边 本题我们要对一个完全图选匹配边,而有一些边不能选择(2n-1条边),我们可以先算出包含这2n-1条边 本题我们要对一个完全图选匹配边,而有一些边不能选择(2n−1条边),我们可以先算出包含这2n−1条边 的 所 有 方 案 , 然 后 再 用 总 的 方 案 数 减 去 这 些 方 案 就 行 了 。 的所有方案,然后再用总的方案数减去这些方案就行了。 的所有方案,然后再用总的方案数减去这些方案就行了。
然 后 我 们 要 求 出 包 含 树 边 的 所 有 匹 配 方 案 , 这 个 可 以 用 树 形 d p 来 求 : 然后我们要求出包含树边的所有匹配方案,这个可以用树形dp来求: 然后我们要求出包含树边的所有匹配方案,这个可以用树形dp来求:
状 态 表 示 : 设 f [ u ] [ i ] [ 0 / 1 ] 表 示 以 点 u 为 根 节 点 的 子 树 中 , 有 i 个 匹 配 , 并 且 u 节 点 是 否 参 与 匹 配 的 方 案 数 状态表示:设f[u][i][0/1]表示以点u为根节点的子树中,有i个匹配,并且u节点是否参与匹配的方案数 状态表示:设f[u][i][0/1]表示以点u为根节点的子树中,有i个匹配,并且u节点是否参与匹配的方案数
状
态
转
移
:
对
于
一
个
以
u
为
根
的
节
点
,
枚
举
其
每
个
子
节
点
v
状态转移:对于一个以u为根的节点,枚举其每个子节点v
状态转移:对于一个以u为根的节点,枚举其每个子节点v
此
时
有
三
种
情
况
:
此时有三种情况:
此时有三种情况:
1 、 合 并 u 与 其 子 树 v , 并 且 不 选 u , f [ u ] [ i + j ] [ 0 ] + = f [ u ] [ i ] [ 0 ] ∗ ( f [ v ] [ j ] [ 0 ] + f [ v ] [ j ] [ 1 ] ) ( 选 不 选 v 对 于 该 状 态 1、合并u与其子树v,并且不选u,f[u][i+j][0]+=f[u][i][0]*(f[v][j][0]+f[v][j][1])(选不选v对于该状态 1、合并u与其子树v,并且不选u,f[u][i+j][0]+=f[u][i][0]∗(f[v][j][0]+f[v][j][1])(选不选v对于该状态 没 有 影 响 ) 没有影响) 没有影响)
2 、 合 并 u 与 其 子 树 v , 选 u , f [ u ] [ i + j ] [ 1 ] + = f [ u ] [ i ] [ 1 ] ∗ ( f [ v ] [ j ] [ 0 ] + f [ v ] [ j ] [ 1 ] ) 2、合并u与其子树v,选u,f[u][i+j][1]+=f[u][i][1]*(f[v][j][0]+f[v][j][1]) 2、合并u与其子树v,选u,f[u][i+j][1]+=f[u][i][1]∗(f[v][j][0]+f[v][j][1])
3 、 合 并 u 与 其 子 树 v , 并 且 加 上 一 个 u − v 的 匹 配 , f [ u ] [ i + j + 1 ] [ 1 ] + = f [ u ] [ i ] [ 0 ] ∗ f [ v ] [ j ] [ 0 ] ( 因 为 要 加 一 个 u − v 的 新 匹 配 , 3、合并u与其子树v,并且加上一个u-v的匹配,f[u][i+j+1][1]+=f[u][i][0]*f[v][j][0](因为要加一个u-v的新匹配, 3、合并u与其子树v,并且加上一个u−v的匹配,f[u][i+j+1][1]+=f[u][i][0]∗f[v][j][0](因为要加一个u−v的新匹配, 所 以 转 移 前 的 状 态 一 定 都 是 不 带 根 节 点 的 ) 所以转移前的状态一定都是不带根节点的) 所以转移前的状态一定都是不带根节点的)
计 算 出 所 有 的 状 态 之 后 , 再 回 来 看 怎 么 求 出 最 终 结 果 : 计算出所有的状态之后,再回来看怎么求出最终结果: 计算出所有的状态之后,再回来看怎么求出最终结果:
对
于
整
个
图
来
说
,
假
设
我
们
一
定
会
选
择
x
条
树
边
,
那
么
方
案
数
就
为
f
[
1
]
[
x
]
[
0
]
+
f
[
1
]
[
x
]
[
1
]
,
而
其
余
的
边
对于整个图来说,假设我们一定会选择x条树边,那么方案数就为f[1][x][0]+f[1][x][1],而其余的边
对于整个图来说,假设我们一定会选择x条树边,那么方案数就为f[1][x][0]+f[1][x][1],而其余的边
随
便
选
,
那
么
就
有
可
能
选
到
x
,
x
+
1
,
x
+
2
,
…
…
条
树
边
。
随便选,那么就有可能选到x,x+1,x+2,……条树边。
随便选,那么就有可能选到x,x+1,x+2,……条树边。
因
为
会
出
现
这
种
选
多
了
的
情
况
,
因
此
我
们
在
求
包
含
树
边
的
情
况
时
,
就
需
要
用
到
容
斥
原
理
。
因为会出现这种选多了的情况,因此我们在求包含树边的情况时,就需要用到容斥原理。
因为会出现这种选多了的情况,因此我们在求包含树边的情况时,就需要用到容斥原理。
我 们 先 将 求 解 过 程 进 行 拆 分 , 枚 举 0 − n , 表 示 当 前 选 择 至 少 存 在 i 条 树 边 , 方 案 数 为 x = f [ 1 ] [ i ] [ 0 ] + f [ 1 ] [ i ] [ 1 ] 。 我们先将求解过程进行拆分,枚举0-n,表示当前选择至少存在i条树边,方案数为x=f[1][i][0]+f[1][i][1]。 我们先将求解过程进行拆分,枚举0−n,表示当前选择至少存在i条树边,方案数为x=f[1][i][0]+f[1][i][1]。 这 样 就 匹 配 了 2 ∗ i 个 点 , 同 时 剩 下 了 2 ∗ n − 2 ∗ i 个 点 任 意 选 择 , 则 有 y 钟 方 案 数 。 当 前 情 况 的 答 案 即 为 : x ∗ y 。 这样就匹配了2*i个点,同时剩下了2*n-2*i个点任意选择,则有y钟方案数。当前情况的答案即为:x*y。 这样就匹配了2∗i个点,同时剩下了2∗n−2∗i个点任意选择,则有y钟方案数。当前情况的答案即为:x∗y。
补
:
y
=
C
2
n
−
2
i
n
−
i
∗
(
n
−
i
)
!
2
n
−
k
补:y=\\fracC^n-i_2n-2i*(n-i)!2^n-k
补:y=2n−kC2n−2in−i∗(n−i)!
2021 ICPC沈阳 L.Perfect Matchings(树形dp+容斥原理)