rt,55pts,TLE
写了个记忆化搜索,在同一个位置,如果时间为 t1 时可走出景区,那么 t2(t1≡t2(modk)),dpx,t%k 代表在位置为 x 时 t%k 的最优解。
下面是我的代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define f(i,j,k) for(register ll i=j;i<=k;i++)
#define pb push_back
const int N=2e4+10,mod=1e9+7;
ll n,m,k,u,v,a,dp[N][105],bst[N][105],maxx,ans=INT_MAX;
bool flag=false;
vector<pair<ll,ll> >g[N];
void dfs(ll x,ll t)//第x个景点,时间为t
{
if(t>=dp[x][t%k]||t>=bst[x][t%k])return;
dp[x][t%k]=t;
if(x==n||g[x].empty())return;
f(i,0,g[x].size()-1)
if(t>=g[x][i].second)dfs(g[x][i].first,t+1);
}
int main()
{
//freopen("bus.in","r",stdin);
//freopen("bus.out","w",stdout);
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n>>m>>k;
f(i,1,m)cin>>u>>v>>a,g[u].pb(make_pair(v,a)),maxx=max(maxx,a);
memset(bst,0x3f3f3f3f,sizeof(bst));
f(i,0,maxx/k)
{
memset(dp,0x3f3f3f3f,sizeof(dp));
// if(dp[n][0]==0x3f3f3f3f&&!flag)
// else flag=true;
//f(i,1,n)f(j,0,k)dp[i][j]=0x3f3f3f3f;
dfs(1,i*k);
if(dp[n][0]!=4557430888798830399)f(j,1,n)f(l,0,k-1)bst[j][l]=min(bst[j][l],dp[j][l]);
}
ans=bst[n][0];
if(ans!=4557430888798830399&&ans!=LONG_LONG_MAX)cout<<ans;
else cout<<-1;
return 0;
}