dfs记忆化,但是有T有WA,想不明白为什么WA
帮忙看看为什么WA吧,T也不应该WA啊
#include <vector>
#include <cstdio>
#include <iostream>
#define ll long long
using namespace std;
ll cn,rn,xn,hn,first[1005],cnt,bj[1005],ans=1e18;
struct JYH{
ll n,time,xs;
};
vector<JYH> v[105][105][105];
struct traffic_light{
ll g,y,r,all;
}tl[1005];
struct road{
ll to,value,next,xian;
}r[1005];
void add(ll from,ll to,ll value,ll xian){
cnt++;
r[cnt].to=to;
r[cnt].xian=xian;
r[cnt].value=value;
r[cnt].next=first[from];
first[from]=cnt;
}
ll dfs(ll now,ll time,ll chd,ll xs,ll zr){
if(time>ans){
return 1e18;
}
// for(int i=0;i<zr;i++){
// printf(" ");
// }
// printf("%lld\n",now);
for(int i=0;i<v[now][chd][zr].size();i++){
if(v[now][chd][zr][i].time==time && v[now][chd][zr][i].xs==xs){
// printf("JYH!!!!!!\n");
return v[now][chd][zr][i].n;
}
}
if(now==cn){
if(xs==xn || xn-xs<=rn-zr){
// printf("%lld %lld\n",ans,time);
ans=min(time,ans);
return time;
}
return 1e18;
}
ll cnt2=1e18;
bj[now]=1;
for(int i=first[now];i!=0;i=r[i].next){
if(bj[r[i].to]==0){
if(time%tl[now].all<tl[now].g){
cnt2=min(cnt2,dfs(r[i].to,time+r[i].value,chd,xs,zr+1));
if(xs<xn){
cnt2=min(cnt2,dfs(r[i].to,time+r[i].xian,chd,xs+1,zr+1));
}
}else if(tl[now].g<=time%tl[now].all && time%tl[now].all<tl[now].g+tl[now].y){
// printf("%lld %lld %lld %lld\n",time,tl[now].all,tl[now].g,tl[now].y);
if(chd<hn){
cnt2=min(cnt2,dfs(r[i].to,time+r[i].value,chd+1,xs,zr+1));
if(xs<xn){
cnt2=min(cnt2,dfs(r[i].to,time+r[i].xian,chd+1,xs+1,zr+1));
}
}else{
cnt2=min(cnt2,dfs(r[i].to,time+r[i].value+tl[now].all-time%tl[now].all,chd,xs,zr+1));
if(xs<xn){
cnt2=min(cnt2,dfs(r[i].to,time+r[i].xian+tl[now].all-time%tl[now].all,chd,xs+1,zr+1));
}
}
}else{
cnt2=min(cnt2,dfs(r[i].to,time+r[i].value+tl[now].all-time%tl[now].all,chd,xs,zr+1));
if(xs<xn){
cnt2=min(cnt2,dfs(r[i].to,time+r[i].xian+tl[now].all-time%tl[now].all,chd,xs+1,zr+1));
}
}
}
}
bj[now]=0;
JYH ls={cnt2,time,xs};
v[now][chd][zr].push_back(ls);
return cnt2;
}
int main(){
// freopen("d.in","r",stdin);
scanf("%lld%lld%lld%lld",&cn,&rn,&xn,&hn);
for(int i=1;i<=cn;i++){
scanf("%lld%lld%lld",&tl[i].g,&tl[i].y,&tl[i].r);
tl[i].all=tl[i].g+tl[i].y+tl[i].r;
}
for(int i=0;i<rn;i++){
ll from,to,value,xian;
scanf("%lld%lld%lld%lld",&from,&to,&value,&xian);
add(from,to,value,xian);
add(to,from,value,xian);
}
// printf("\n");
// for(int i=1;i<=cnt;i++){
// printf("%d:%lld %lld %lld %lld\n",i,r[i].to,r[i].next,r[i].value,r[i].xian);
// }
// printf("\n");
// for(int i=1;i<=cn;i++){
// printf("%d:",i);
// for(int j=first[i];j!=0;j=r[j].next){
// printf("%lld ",j);
// }
// printf("\n");
// }
printf("%lld",dfs(1,0,0,0,0));
return 0;
}