…深搜老以为会爆。。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1000010;
const ll mod = 998244353;
struct edge{
int to,next;
}edges[N<<2];
int head[N],tot=0;
int n;
ll x,y;
void add(int u,int v){
edges[++tot].next = head[u];
edges[tot].to = v;
head[u] = tot;
}
ll dp[N][2];
int vis[N];
ll dfs(int t,int color){//0表示普通颜色,1表示特殊颜色
if(dp[t][color]) return dp[t][color];
vis[t]=1; //标记当前节点已经访问过
ll ans = 0,ans1 = 1,ans2 = 1;
int is_leaf = 1;
for(int i = head[t]; i; i=edges[i].next){
if(!vis[edges[i].to]){
is_leaf = 0;
//下一个节点选择普通颜色
ans1 = ans1*dfs(edges[i].to,0)%mod;
//下一个节点选择特殊颜色
ans2 = ans2*dfs(edges[i].to,1)%mod;
}
}
//当前节点选择普通颜色
ans1 = ans1*x%mod;
//当前节点选择特殊颜色
ans2 = ans2*(y-color)%mod;
//要把当前节点的状态vis改为0,因为下次可能会用到
vis[t] = 0;
if(is_leaf) //当前节点是叶节点
ans = (x+y-color)%mod; //color为1时表示上一个节点是特殊颜色,0普通颜色,所以是颜色总数-color
else
ans = (ans1+ans2)%mod;
dp[t][color] = ans; //保存当前节点为color的方案数
return ans;
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin >> n >> x >> y;
int u,v;
for(int i = 1;i<n;i++){
cin >> u >> v;
add(u,v);
add(v,u);
}
cout << dfs(1,0) << endl;
return 0;
}