dfs+dp 初始化的时候写了i<=N,错了无数次,要细心啊要细心!!!
#include<stdio.h>
#include<string.h>
const int N=50,inf=1e9;
char scene[N];
int dp[N][N];//表示在i场景需要j个男 所需最小女个数
int start[N],cnt;
struct edge{
int v,next;
}e[N*N*2];
void add(int u,int v){
e[cnt].v=v;
e[cnt].next=start[u];
start[u]=cnt++;
}
void dfs(int now,int go){
if(now==go) return;
for(int i=start[now];i!=-1;i=e[i].next){
int next=e[i].v,update=0;
for(int j=0;j<=go;j++){//状态转移
if(dp[now][j]==inf) continue;
if(scene[next]=='A'&&dp[next][j+1]>dp[now][j])
dp[next][j+1]=dp[now][j],update=1;
else if(scene[next]=='B'&&dp[next][j]>dp[now][j]+1)
dp[next][j]=dp[now][j]+1,update=1;
}
if(update) dfs(next,go);
}
}
void init(){
cnt=0;
for(int i=0;i<N;i++)//i<=N错误
start[i]=-1;
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
dp[i][j]=inf;
}
int main(){
int tt,n,m,boys,girls;
for(scanf("%d",&tt);tt>0;tt--){
init();
scanf("%d %d %d %d",&n,&m,&boys,&girls);
scanf("%s",scene+1);
for(int i=0,u,v;i<m;i++){
scanf("%d %d",&u,&v);
add(u,v),add(v,u);
}
if(scene[1]=='A') dp[1][1]=0;
else dp[1][0]=1;
dfs(1,n);
int goal=0;
for(int i=0;i<=boys;i++)
if(dp[n][i]<=girls){
goal=1;break;
}
printf("%s\n",goal?"yes":"no");
}
return 0;
}