The 15th Chinese Northeast Collegiate C. Vertex Deletion(树形dp)

Posted issue是fw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了The 15th Chinese Northeast Collegiate C. Vertex Deletion(树形dp)相关的知识,希望对你有一定的参考价值。

LINK

对于节点 u u u来说(分别对应状态 0 , 1 , 2 0,1,2 0,1,2)

定义 f [ i ] [ 0 / 1 / 2 ] f[i][0/1/2] f[i][0/1/2]表示当 i i i分别满足以下三个条件时,子树内节点全部符合要求时的答案

Ⅰ.如果删去这个节点,那么 u u u一定满足条件

Ⅱ.如果不删去 u u u,且所有儿子被删掉.那么此时 u u u还没满足条件,需要父亲也不被删去

Ⅲ.如果不删去 u u u,且所有儿子中至少有一个没删掉.那么 u u u满足条件,父亲怎样无所谓

可以发现这个设计非常合理,比如

f [ u ] [ 0 ] = ∏ v ∈ s o n u f [ v ] [ 0 ] + f [ v ] [ 2 ] f[u][0]=\\prod\\limits_{v\\in son_u}f[v][0]+f[v][2] f[u][0]=vsonuf[v][0]+f[v][2]

f [ u ] [ 1 ] = ∏ v ∈ s o n u f [ v ] [ 0 ] f[u][1]=\\prod\\limits_{v\\in son_u}f[v][0] f[u][1]=vsonuf[v][0]

但是发现转移 f [ u ] [ 2 ] f[u][2] f[u][2]时有点变化,我们可以采用容斥的办法

也就是所有方案数-不合法的方案数,即为

f [ u ] [ 2 ] = ∏ v ∈ s o n u ( f [ v ] [ 0 ] + f [ v ] [ 1 ] + f [ v ] [ 2 ] ) − ∏ v ∈ s o n u f [ v ] [ 0 ] f[u][2]=\\prod\\limits_{v\\in son_u}(f[v][0]+f[v][1]+f[v][2])-\\prod\\limits_{v\\in son_u}f[v][0] f[u][2]=vsonu(f[v][0]+f[v][1]+f[v][2])vsonuf[v][0]

显然 f [ r o o t ] [ 0 ] + f [ r o o t ] [ 2 ] f[root][0]+f[root][2] f[root][0]+f[root][2]即是答案

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int mod = 998244353;
const int maxn = 1e5+10; 
int n,f[maxn][3];
vector<int>vec[maxn];
/*
f[i][0]表示自己被删掉
f[i][1]表示自己没删去,且没有儿子和自己相连
f[i][2]表示自己没删去,且至少有一个儿子和自己相连 
*/ 
void dfs(int u,int fa)
{
	f[u][0] = f[u][1] = f[u][2] = 1;
	for(auto v:vec[u] )
	{
		if( v==fa )	continue;
		dfs( v,u );
		f[u][0] = ( f[v][0]+f[v][2] )%mod*f[u][0]%mod;
		f[u][1] = f[u][1]*f[v][0]%mod;
		f[u][2] = ( f[v][0]+f[v][1]+f[v][2] )%mod*f[u][2]%mod; 
	}
	f[u][2] = ( f[u][2]-f[u][1] )%mod;
	//f[u][2]为总方案数-所有儿子都被删去的方案数 
}
signed main()
{
	int t; cin >> t;
	while( t-- )
	{
		cin >> n;
		for(int i=1;i<n;i++)
		{
			int l,r; scanf("%lld%lld",&l,&r);
			vec[l].push_back( r ), vec[r].push_back( l );	
		}	
		dfs( 1,0 );
		cout << (( f[1][0]+f[1][2] )%mod+mod)%mod << endl;
		for(int i=1;i<=n;i++)	vec[i].clear();
	}	
}

以上是关于The 15th Chinese Northeast Collegiate C. Vertex Deletion(树形dp)的主要内容,如果未能解决你的问题,请参考以下文章

The 15th Chinese Northeast Collegiate C. Vertex Deletion(树形dp)

The 15th Chinese Northeast L. k-th Smallest Common Substring(广义SAM,对节点字典序排序)

The 15th Chinese Northeast Collegiate Programming Contest C. Vertex Deletion (树形dp)

The 13th Chinese Northeast Contest H. Skyscraper(差分+树状数组)

The 13th Chinese Northeast Contest B. Balanced Diet(前缀和)

The 13th Chinese Northeast Contest C. Line-line Intersection(平面几何)