https://atcoder.jp/contests/tkppc4-1/tasks/tkppc4_1_h
前提知識
解説
https://atcoder.jp/contests/tkppc4-1/submissions/6664209
無向グラフで最短時間といえばダイクストラである。
実際それ以外で解くにはいろいろ尖った形にする必要がある。
ダイクストラの枠組みで考えてみると解ける。
dist[cu] := 駅cuに到達するための最短時間
int N, M; ll K; int T[201010]; using Edge = tuple<int, int, int>; vector<Edge> E[201010]; bool vis[201010]; ll dist[201010]; //--------------------------------------------------------------------------------------------------- ll djik() { min_priority_queue<pair<ll, int>> que; rep(i, 0, N) dist[i] = infl; dist[0] = 0; que.push({ 0, 0 }); while (!que.empty()) { auto q = que.top(); que.pop(); ll cst = q.first; int cu = q.second; if (vis[cu]) continue; vis[cu] = true; if (cu == N - 1) return cst; cst += T[cu]; fore(e, E[cu]) { int to, c, d; tie(to, c, d) = e; ll cst2 = cst; if (0 < cst2 % d) cst2 += (d - (cst2 % d)); cst2 += c; if (chmin(dist[to], cst2)) que.push({ dist[to], to }); } } return infl; } //--------------------------------------------------------------------------------------------------- void _main() { cin >> N >> M >> K; rep(i, 1, N - 1) cin >> T[i]; rep(i, 0, M) { int a, b, c, d; cin >> a >> b >> c >> d; a--; b--; E[a].push_back(Edge(b, c, d)); E[b].push_back(Edge(a, c, d)); } ll ans = djik(); if (K < ans) ans = -1; cout << ans << endl; }