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 u∈S,v∈T 的情况,已经匹配了 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

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

被折叠的 条评论
为什么被折叠?



