結果
| 問題 |
No.3111 Toll Optimization
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-04-19 18:04:04 |
| 言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 357 ms / 5,000 ms |
| コード長 | 998 bytes |
| コンパイル時間 | 3,802 ms |
| コンパイル使用メモリ | 294,420 KB |
| 実行使用メモリ | 19,760 KB |
| 最終ジャッジ日時 | 2025-04-19 18:04:20 |
| 合計ジャッジ時間 | 16,031 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 70 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const ll LLINF = 1LL << 60;
int main() {
int N, M, K;
cin >> N >> M >> K;
vector<ll> C(M);
for(auto& e : C) cin >> e;
vector<vector<pair<int, ll>>> G(N);
for(int i = 0; i < M; i++) {
int u, v;
cin >> u >> v;
u--, v--;
G[u].emplace_back(v, C[i]);
G[v].emplace_back(u, C[i]);
}
vector<vector<ll>> dp(N, vector<ll>(K + 1, LLINF));
using Data = tuple<ll, int, int>;
priority_queue<Data, vector<Data>, greater<Data>> que;
que.emplace(0, 0, K);
dp[0][K] = 0;
while(!que.empty()) {
auto [d, u, rem] = que.top();
que.pop();
if(dp[u][rem] < d) continue;
for(auto [v, w] : G[u]) {
if(dp[v][rem] > d + w) {
dp[v][rem] = d + w;
que.emplace(dp[v][rem], v, rem);
}
if(rem > 0 and dp[v][rem - 1] > d) {
dp[v][rem - 1] = d;
que.emplace(dp[v][rem - 1], v, rem - 1);
}
}
}
ll ans = *min_element(dp[N - 1].begin(), dp[N - 1].end());
if(ans == LLINF) ans = -1;
cout << ans << endl;
}