Codeforces Round 926 (Div. 2) D - Sasha and a Walk in the City

本文介绍了如何使用树形动态规划解决一个编程问题,涉及在给定树中选择坏点以保证任何路径上不超过两个坏点。C++代码展示了如何计算并输出满足条件的合法选法数量,对998244353取模。
摘要由CSDN通过智能技术生成

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值