rt,头一次见厌氧的,很激动。
不吸氧能AC。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 405, mod = 1e9 + 7;
int n, w, m;
int head[maxn], nxt[maxn << 1], to[maxn << 1], ww[maxn << 1], cnt = 0, siz[maxn], in[maxn];
long long dp[maxn][maxn][2];
void add(int u, int v, int w){
nxt[++ cnt] = head[u];
to[cnt] = v;
ww[cnt] = w;
head[u] = cnt;
}
void dfs(int x, int f){
dp[x][0][0] = dp[x][1][1] = 1;
siz[x] = 1;
for(int i = head[x]; i; i = nxt[i]){
int j = to[i];
dfs(j, x);
siz[x] += siz[j];
for(int k = min(siz[x], w); k >= 0; k --){
long long dp0 = 0, dp1 = 0;
for(int l = 0; l <= min(siz[j], w); l ++){
dp0 += (dp[j][l][0] + dp[j][l][1]) * dp[x][k - l][0] % mod;
if(ww[i] == 2){
dp1 += dp[j][l][0] * dp[x][k - l][1] % mod;
}else{
dp1 += dp[j][l][1] * dp[x][k - l][1] % mod;
}
dp0 %= mod;
dp1 %= mod;
}
dp[x][k][0] = dp0;
dp[x][k][1] = dp1;
}
}
}
int main(){
scanf("%d %d %d", &n, &w, &m);
for(int i = 1; i <= m; i ++){
char c;
int u, v;
scanf("%c", &c);
scanf("%c %d %d", &c, &u, &v);
int d = 1 + (c == 'A');
add(u, v, d);
in[v] += 1;
}
for(int i = 1; i <= n; i ++){
if(in[i] == 0){
add(0, i, 1);
}
}
dfs(0, 0);
printf("%lld", dp[0][w][0] % mod);
return 0;
}