传送门:
题意:给你一个图,要求从起点s到终点t,可以经过任意边k次,但点x必须经过偶数次,求合法路径的方案数。
分析:dp写不来,但是是计数题且总边数m不大(2000),考虑类似于数位dp的记忆化dfs。
代码:
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int mod=998244353;
int n,m,k,s,t,x;
vector<int>mp[2005];
int dp[2005][2005][2];
int dfs(int step,int u,int even)
{
if(step==k) return u==t&&even;
if(~dp[step][u][even]) return dp[step][u][even];
int ans=0;
for(auto v:mp[u])
{
ans+=dfs(step+1,v,even^(v==x));
ans%=mod;
}
dp[step][u][even]=ans;
return ans;
}
signed main()
{
cin>>n>>m>>k>>s>>t>>x;
for(int i=1;i<=m;i++)
{
int u,v;
cin>>u>>v;
mp[u].push_back(v);
mp[v].push_back(u);
}
memset(dp,-1,sizeof dp);
cout<<dfs(0,s,1)<<endl;
}