58 lines
1.3 KiB
C++
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;
|
|
}
|