完全没有想到是DP....
事后总结:要取模,奇偶,求方案数。
就用DP[i][j][k]来表示,从走到i这个点,j为所在序列中的位置,而k用来表示奇偶性。
如果加入了一个数,和X一样,显然现在它变成了偶/奇,从原来的奇偶性相反的DP中转移过来
如果未加入,从原来的奇偶性相同的DP中转移过来
AC代码:
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <cmath>
#include <algorithm>
#include <map>
//#include <pair>
#include<utility>
#define int long long
using namespace std;
const int mod = 998244353;
int dp[2010][2010][2];
pair<int, int> v[2010];
signed main() {
int N,M,K,S,T,X;
// 数列里面要有k+1个点,全部从1-n里面拿
// 要满足起点是s,终点是t,并且A[i]要和A[i+1]相连
// x出现偶数次
// 思路:dp[i][j][k]表示第i个点,序列中第j个位置,x出现的奇数还是偶数次
cin>>N>>M>>K>>S>>T>>X;
for(int i=1;i<=M;++i){cin>>v[i].first;cin>>v[i].second;}
dp[S][0][0]=1;
for(int i=0;i<K;++i){
for(int j=1;j<=M;++j){
int x = v[j].first;int y=v[j].second;
for(int k=0;k<=1;++k){
// 奇数和偶数的转换
(dp[x][i+1][k] += dp[y][i][k ^ (X==y)]) %= mod;
(dp[y][i+1][k] += dp[x][i][k ^ (X==x)]) %= mod;
}
}
}
cout<<dp[T][K][0]<<endl;
// x x x z
return 0;
}