E - King Bombee

E - King Bombee

考点:树形\(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;
}
posted @ 2022-03-21 01:26  合肥学院王星力  阅读(63)  评论(0)    收藏  举报