結果
問題 | No.3111 Toll Optimization |
ユーザー |
|
提出日時 | 2025-04-18 23:20:31 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 262 ms / 5,000 ms |
コード長 | 1,420 bytes |
コンパイル時間 | 1,978 ms |
コンパイル使用メモリ | 210,164 KB |
実行使用メモリ | 19,636 KB |
最終ジャッジ日時 | 2025-04-18 23:20:45 |
合計ジャッジ時間 | 11,676 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 70 |
ソースコード
#include <bits/stdc++.h> using namespace std; using ll = long long; const ll INF = 1e18; int main() { int N, M, K; cin >> N >> M >> K; vector<ll> C(M); for (int i = 0; i < M; ++i) { cin >> C[i]; } vector<vector<pair<int, ll>>> adj(N + 1); for (int i = 0; i < M; ++i) { int u, v; cin >> u >> v; adj[u].emplace_back(v, C[i]); adj[v].emplace_back(u, C[i]); } vector<vector<ll>> dist(N + 1, vector<ll>(K + 1, INF)); priority_queue<pair<ll, pair<int, int>>, vector<pair<ll, pair<int, int>>>, greater<>> pq; dist[1][K] = 0; pq.emplace(0, make_pair(1, K)); while (!pq.empty()) { auto [current_cost, state] = pq.top(); auto [u, k] = state; pq.pop(); if (current_cost > dist[u][k]) continue; for (auto [v, c] : adj[u]) { if (dist[v][k] > current_cost + c) { dist[v][k] = current_cost + c; pq.emplace(dist[v][k], make_pair(v, k)); } if (k > 0 && dist[v][k-1] > current_cost) { dist[v][k-1] = current_cost; pq.emplace(dist[v][k-1], make_pair(v, k-1)); } } } ll ans = INF; for (int k = 0; k <= K; ++k) { ans = min(ans, dist[N][k]); } if (ans == INF) { cout << -1 << endl; } else { cout << ans << endl; } return 0; }