dfs记忆化求调
查看原帖
dfs记忆化求调
416549
Kao_Potato楼主2023/8/18 09:38

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;
}
2023/8/18 09:38
加载中...