cf刷题日记
输入:
4
3
1 3
3 2
4
3 4
2 3
3 1
5
1 2
3 4
5 1
2 3
4
1 2
2 3
3 4
输出:
7
12
16
11
题意:这个题的题意我看了好久好久才看懂的QWQ,就是在这个树上选择一些坏的点,如果这种选法使得树上没有任何一条路径上有三个及以上的坏的点,那么这种选法就是合法的,题目要求的是一共有多少种选法,答案对998244353取模。
这是一个树形dp的题,代码如下:
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=6e5+5,mod=998244353;
int e[N],h[N],ne[N],idx;
void add(int a,int b)
{
e[idx]=b;
ne[idx]=h[a];
h[a]=idx++;
}
int n,f[N][3];
void dfs(int u,int pre)
{
f[u][1]=f[u][0]=1;
f[u][2]=0;
for(int i=h[u];~i;i=ne[i])
{
int v=e[i];
if(v==pre) continue;
dfs(v,u);
f[u][1]=f[u][1]*(f[v][0]+f[v][1])%mod;
f[u][2]=(f[u][2]+f[v][2]+f[v][1])%mod;
}
}
void solve()
{
cin>>n;
idx=0;
for(int i=0;i<=n;i++) h[i]=-1;
int u,v;
for(int i=1;i<n;i++)
cin>>u>>v,add(u,v),add(v,u);
dfs(1,1);
cout<<(f[1][0]+f[1][1]+f[1][2])%mod<<endl;
}
signed main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int T;
cin>>T;
while(T--) solve();
return 0;
}