记录编号 583874 评测结果 AAAWWAAWWWAAAWWWWWWW
题目名称 [CSP 2023J]旅游巴士 最终得分 40
用户昵称 Gravatar在大街上倒立游泳 是否通过 未通过
代码语言 C++ 运行时间 0.511 s
提交时间 2023-10-23 21:07:50 内存使用 11.79 MiB
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
struct ngm{
    long long i,j,d;
    friend bool operator < (ngm a,ngm b){
        return a.d<b.d;
    }
};
typedef long long ll;
ll f[10010][110],lian[20010],xia[20010],tot=0,w[20010],n,m,k,head[10010];
bool vis[10010][110];
queue<ngm> dui;
void add(ll x,ll y,ll v){
	tot++;
	xia[tot]=head[x];
	head[x]=tot;
	lian[tot]=y;
	w[tot]=v;
}
void dfs(ll p,ll mo){
	ll xian=head[p];
	while(lian[xian]){
		ll ans=f[p][mo]+1;
		if(ans<=w[xian]){
			ans+=(((w[xian]-ans)/k)*k);
			if(ans<=w[xian]) ans+=k;
		}
		if(f[lian[xian]][(mo+1)%k]==-1){
			f[lian[xian]][(mo+1)%k]=ans;
			dfs(lian[xian],(mo+1)%k);
		}
		else{
			if(ans<f[lian[xian]][(mo+1)%k]){
				f[lian[xian]][(mo+1)%k]=ans;
				dfs(lian[xian],(mo+1)%k);
			}
		}
		xian=xia[xian]; 
	}
}
void djstl(){
    while(!dui.empty()){
        ngm xin=dui.front();
        //cout<<xin.i<<' '<<xin.j<<' '<<xin.d<<endl;
        dui.pop();
        if(vis[xin.i][xin.j]) continue;
        vis[xin.i][xin.j]=1;
        long long xian=head[xin.i];
        while(lian[xian]){
            long long t=xin.d;
            if(t<w[xian]){
                t+=((w[xian]-t)/k)*k+(((w[xian]-t)%k)?k:0);
            }
            t++;
            
            if(!vis[lian[xian]][(xin.d+1)%k]&&t<f[lian[xian]][(xin.d+1)%k]){
                //cout<<"*"<<lian[xian]<<' '<<(xin.d+1)%k<<' '<<t<<endl;
                f[lian[xian]][(xin.d+1)%k]=t;
                dui.push({lian[xian],(xin.d+1)%k,t});
            }
            xian=xia[xian];
        }
    }
}
int main(){
	freopen("bus.in","r",stdin);
	freopen("bus.out","w",stdout);
	scanf("%lld%lld%lld",&n,&m,&k);
	for(ll i=1;i<=m;i++){
		ll u,v,a;
		scanf("%lld%lld%lld",&u,&v,&a);
		add(u,v,a);
	}
	memset(f,0x3f,sizeof(f));
	f[1][0]=0;
	//vis[1][0]=1;
	dui.push({1,0,0});
	djstl();
	if(f[n][0]==0x3f3f3f3f3f3f3f3f) f[n][0]=-1;
   	printf("%lld",f[n][0]);
	return 0;
}