The 15th Chinese Northeast Collegiate C. Vertex Deletion(树形dp)
Posted issue是fw
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了The 15th Chinese Northeast Collegiate C. Vertex Deletion(树形dp)相关的知识,希望对你有一定的参考价值。
对于节点 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]=v∈sonu∏f[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]=v∈sonu∏f[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]=v∈sonu∏(f[v][0]+f[v][1]+f[v][2])−v∈sonu∏f[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(平面几何)