样例没过
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
typedef pair<int,int> PII;
const int N=1e4+100,M=2e4+100,K=110,INF=0x3f3f3f3f;
int n,m,k,u,v,a,t[N],bk,dp[N][K],tim;
struct node1
{
int id,last,val;
}b[M];
struct node2
{
int qid,qtime;
}qt;
bool operator < (const node2& a1,const node2& a2)
{
return a1.qtime<a2.qtime;
}
priority_queue<node2> q;
void add(int a1,int a2,int a3)
{
b[++bk].id=a2;
b[bk].last=t[a1];
b[bk].val=a3;
t[a1]=bk;
}
int main()
{
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&u,&v,&a);
add(u,v,a);
}
memset(dp,0x3f,sizeof dp);
q.push({1,0});
dp[1][0]=0;
while(!q.empty())
{
qt=q.top();
q.pop();
if(qt.qtime>=dp[qt.qid][qt.qtime%k]) continue;
for(int i=t[qt.qid];i;i=b[i].last)
{
tim=qt.qtime;
if(tim+1<b[i].val) tim+=(b[i].val-tim-1+k)/k*k;
if(tim+1<dp[b[i].id][(tim+1)%k])
{
dp[b[i].id][(tim+1)%k]=tim+1;
q.push({b[i].id,tim+1});
}
}
}
dp[n][0]<INF?printf("%d",dp[n][0]):printf("-1");
return 0;
}