sairate c9f8710d03 sairate<sairate@sina.cn>
Signed-off-by: sairate <sairate@sina.cn>
2025-07-12 16:05:52 +08:00

58 lines
1.3 KiB
C++

#include <cstdio>
#include <algorithm>
#include <queue>
#include <cstring>
#define N 10010
#define M 20010
#define K 110
#define INF 0x3f3f3f3f
int n, m, k;
int dis[N][K];
struct T {
int head, to, nxt, w;
} a[M];
int tot;
void add(int u, int v, int w) {
a[++tot].to = v;
a[tot].w = w;
a[tot].nxt = a[u].head;
a[u].head = tot;
}
inline int ceil(int x, int y) {
return x % y == 0 ? x / y : x / y + 1;
}
struct V {
int id, dis;
} s, now, nxt;
void bfs() {
s.id = 1;
s.dis = dis[1][0] = 0;
std::queue<V> q;
q.push(s);
while (q.size()) {
now = q.front();
q.pop();
int u = now.id;
for (int i = a[u].head; i; i = a[i].nxt) {
nxt.id = a[i].to;
nxt.dis = now.dis >= a[i].w ? now.dis + 1 : now.dis + 1 + ceil(a[i].w - now.dis, k) * k;
if (dis[nxt.id][nxt.dis % k] > nxt.dis) {
dis[nxt.id][nxt.dis % k] = nxt.dis;
q.push(nxt);
}
}
}
}
int main() {
scanf("%d %d %d", &n, &m, &k);
for (int i = 1; i <= m; i++) {
int u, v, w;
scanf("%d %d %d", &u, &v, &w);
add(u, v, w);
}
memset(dis, 0x3f, sizeof(dis));
bfs();
printf("%d\n", dis[n][0] == INF ? -1 : dis[n][0]);
return 0;
}