考点:树形\(DP\)
\(dp[i][j][k]\)表示从源点\(s\)经过\(i\)条边,经过顶点\(x\)的次数\(mod2 = k\)方案数。
答案就是 \(dp[k][t][0]\)
状态转移:
\(j\)不等于\(u\)
\(dp[i][j][0] = \sum{dp[i - 1][x][0]}\),
\(dp[i][j][1] = \sum{dp[i - 1][x][1]}\),其中(\(x\)是\(j\)的所有邻边)
\(j = u\)
\(dp[i][j][1] = \sum{dp[i - 1][x][0]}\),
\(dp[i][j][1] = \sum{dp[i - 1][x][0]}\)
初始化\(dp[0][s][0] = 1\)
int main()
{
cin >> n >> m >> k >> s >> t >> x;
while(m -- ){
int a, b;
cin >> a >> b;
v[a].pb(b), v[b].pb(a);
}
f[0][s][0] = 1;
for(int i = 1; i <= k; i ++ ){
for(int j = 1; j <= n; j ++ ){
for(int it : v[j]){
if(it != x){
f[i][j][0] += f[i - 1][it][0];
f[i][j][1] += f[i - 1][it][1];
}else{
f[i][j][0] += f[i - 1][it][1];
f[i][j][1] += f[i - 1][it][0];
}
f[i][j][0] %= mod;
f[i][j][1] %= mod;
}
}
}
printf("%lld",f[k][t][0]);
return 0;
}