YbtOJ NOIP2020 模拟赛 B 组 Day4 B. 预算缩减【树形dp】


题目:

题目传送门


题意:

给出一棵树,对于每条边我们可以选择删或不删,但我们始终需要保证任意连通块的大小需要 ⩾ k \geqslant k k,求有多少方案数


分析:

f u , s f_{u,s} fu,s表示以 u u u为根的子树里, u u u所在的连通块的大小为 s s s v v v表示 u u u的一个子节点
这样的话我们可以得到两个转移方程 : : :
1. f u , s 1 + s 2 + = f u , s 1 ∗ f v , s 2 1.f_{u,s1+s2}+=f_{u,s1}*f_{v,s2} 1.fu,s1+s2+=fu,s1fv,s2
2. f u , s 1 + = f u , s 1 ∗ f v , s 2 ( s 2 ⩾ k ) 2.f_{u,s1}+=f_{u,s1}*f_{v,s2}(s2\geqslant k) 2.fu,s1+=fu,s1fv,s2(s2k)
式子 1 1 1表示的是不删 u , v u,v u,v这条边,式子 2 2 2表示的是删去 u , v u,v u,v这条边,对于式子 2 2 2,因为以 v v v为根的子树变成了一个独立的连通块,所以我们需要保证 t a ta ta的大小要 ⩾ k \geqslant k k
任意两点的贡献我们都只会在 L C A LCA LCA处计算一次,所以整个树形dp的时间复杂度就是 O ( n 2 ) O(n^2) O(n2)


代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
#include<queue>
#define LL long long
#define mo 786433
using namespace std;
inline LL read()
{
    
    
	LL s=0,f=1; char c=getchar();
	while(c<'0'||c>'9') {
    
    if(c=='-') f=-1;c=getchar();}
	while(c>='0'&&c<='9') {
    
    s=s*10+c-'0';c=getchar();}
	return s*f;
}
struct node{
    
    
	LL from,to,next;
}e[10005];
LL ls[5005],cnt=0;
void add(LL x,LL y)
{
    
    
	e[cnt]=(node){
    
    x,y,ls[x]};
	ls[x]=cnt++;
	return;
}
LL size[5005],f[5005][5005],mid[5005],n,k;
void dfs(LL fa,LL u)
{
    
    
	size[u]=1;f[u][1]=1;
	for(LL i=ls[u];~i;i=e[i].next)
	{
    
    
		LL v=e[i].to;
		if(v==fa) continue;
		dfs(u,v);
		memset(mid,0,sizeof(mid));
		for(LL j=1;j<=size[u];j++)
		{
    
    
			for(LL ij=1;ij<=size[v];ij++) (mid[j+ij]+=f[u][j]*f[v][ij]%mo)%=mo;
			for(LL ij=k;ij<=size[v];ij++) (mid[j]+=f[u][j]*f[v][ij]%mo)%=mo;
		}
		size[u]+=size[v];
		for(LL j=1;j<=size[u];j++) f[u][j]=mid[j];
	}
	return;
}
int main()
{
    
    
	freopen("cut.in","r",stdin);
	freopen("cut.out","w",stdout);
	n=read();k=read();
	memset(ls,-1,sizeof(ls));
	for(LL i=1;i<n;i++)
	{
    
    
		LL x=read(),y=read();
		add(x,y);add(y,x);
	}
	dfs(0,1);
	LL ans=0;
	for(LL i=k;i<=size[1];i++) (ans+=f[1][i])%=mo;
	cout<<ans%mo;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_35786326/article/details/109035174