CF762F Tree nesting 题解

这篇博客介绍了CF762F问题的解决方案,强调题目涉及的是联通子图。作者建议选定一个节点作为根节点,并采用树形动态规划(Tree DP)来解决。由于无根树的特性,直接钦定根节点会导致某些形态未被计算,因此需要处理重复计算的情况,即计算一个等价树被计数的次数,并将结果进行修正。

CF762F

其实这个题也不是很复杂。

首先题目背景里说的是一个联通子图!!!

发现数据范围其实不是很大,我们不妨钦定一个节点为根 S S S 的节点。那么本质上对于 S S S 中的每一个节点我们都需要对 T T T 进行一次匹配。

显然因为是联通子图是不可能进行树哈希的,我们考虑进行树形 D p Dp Dp

不妨考虑设 f ( u , v , S ) f(u, v, S) f(u,v,S) 表示对于 u ∈ S , v ∈ T u \in S, v \in T uS,vT 的情况,已经匹配了 T T T 中集合 S S S 的方案数。

但是题目中说明的是无根树,如果再对于 T T T 钦定一个根的话会产生有些形态没有计算的情况。

所以我们不得不考虑重复计算的情况,也就是一个情况能计算几次。本质就是一个和 T T T 本质相同的树会被计算几次。

这两个相除即可。

#include <bits/stdc++.h>
using namespace std;

#define Fread
#define Getmod

#ifdef Fread
char buf[1 << 21], *iS, *iT;
#define gc() (iS == iT ? (iT = (iS = buf) + fread (buf, 1, 1 << 21, stdin), (iS == iT ? EOF : *iS ++)) : *iS ++)
#define getchar gc
#endif // Fread

template <typename T>
void r1(T &x) {
   
   
	x = 0;
	char c(getchar());
	int f(1);
	for(; c < '0' || c > '9'; c = getchar()) if(c == '-') f = -1;
	for(; '0' <= c &am
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值