[nk] 牛客练习赛97 D.月之暗面 树形dp记录方案数

前言

传送门 :

题意

在这里插入图片描述

思路

一眼题了属于是,第一次碰到树形 d p dp dp 记录方案数记录一下

状态表示 :
d p [ i ] [ 0 ] dp[i][0] dp[i][0]表示当前节点使用普通颜色
d p [ i ] [ 1 ] dp[i][1] dp[i][1]表示当前节点使用特殊颜色

状态转移 :
上司的舞会,
d p [ u ] [ 0 ] = d p [ u ] [ 0 ] ∗ ( d p [ x ] [ 0 ] + d p [ x ] [ 1 ] ∗ y % m o d ) % m o d ; dp[u][0] = dp[u][0]*(dp[x][0]+dp[x][1]*y\%mod)\%mod; dp[u][0]=dp[u][0](dp[x][0]+dp[x][1]y%mod)%mod;
d p [ u ] [ 1 ] = d p [ u ] [ 1 ] ∗ ( d p [ x ] [ 0 ] + d p [ x ] [ 1 ] ∗ ( y − 1 ) % m o d ) % m o d ; dp[u][1] = dp[u][1]*(dp[x][0]+dp[x][1]*(y-1)\%mod)\%mod; dp[u][1]=dp[u][1](dp[x][0]+dp[x][1](y1)%mod)%mod;

Mycode


#include <iostream>
#include <vector>
#include <map>
#include <cstring>
#include <queue>
#include <set>
#include <algorithm>
using namespace std;
#define IOS  ios::sync_with_stdio(false);
#define CIT  cin.tie(0);
#define COT  cout.tie(0);

#define ll long long
#define x first
#define y second
#define pb push_back
#define endl '\n'
#define all(x) (x).begin(),x.end()
#define Fup(i,a,b) for(int i=a;i<=b;i++)
#define Fde(i,a,b) for(int i=a;i>=b;i--)

typedef priority_queue<int,vector<int>,greater<int>>  Pri_m;
typedef pair<int,int> pii;
typedef vector<int> VI;
map<int,int> mp;
const int N = 1e6+10 ,mod = 998244353;
ll  dp[N][2];
int has_fa[N];

int n,x,y;
vector<int> g[N];

void dfs(int u,int fa){
	dp[u][0] = x;
	dp[u][1] = 1;

	for(auto x  : g[u]){
		if(x == fa) continue;
		dfs(x,fa);
		dp[u][0] =  dp[u][0]*(dp[x][0]+dp[x][1]*y%mod)%mod;
		dp[u][1] =  dp[u][1]*(dp[x][0]+dp[x][1]*(y-1)%mod)%mod;
	}
}
void solve(){
	cin>>n>>x>>y;
	for(int i = 1; i<n;i++){
		int a,b;cin>>a>>b;
		g[a].pb(b);
		has_fa[b] = 1;
	}

	int root = 1;
	while(has_fa[root]) root++;

	dfs(root,0);
	cout<<(dp[root][1]*y + dp[root][0])%mod<<endl;

}

int main(){
    //int t;cin>>t;while(t--)
    solve();
    return 0 ;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值