結果
| 問題 |
No.3111 Toll Optimization
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-04-18 23:22:52 |
| 言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 767 ms / 5,000 ms |
| コード長 | 1,810 bytes |
| コンパイル時間 | 3,987 ms |
| コンパイル使用メモリ | 316,848 KB |
| 実行使用メモリ | 41,324 KB |
| 最終ジャッジ日時 | 2025-04-18 23:23:23 |
| 合計ジャッジ時間 | 24,227 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 70 |
ソースコード
#include<iostream>
#include<iomanip>
#include<vector>
#include<math.h>
#include<algorithm>
#include<map>
#include<queue>
#include<stack>
#include<deque>
#include<set>
#include<cmath>
#include<ctime>
#include<bitset>
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
using ll = long long;
using vec = vector<ll>;
using Graph = vector<vec>;
using Pair = pair<ll,ll>;
void debug1(vec v){for(auto x:v)cout << x << ' ';cout << endl;}
void debug2(vector<Pair> v){for(auto x:v)cout << '(' << x.first << ',' << x.second << ')' << endl;}
void debug3(Graph v){rep(i,0,v.size()-1)debug1(v[i]);cout << endl;}
ll st = 1000000000000009;
set<Pair>visited;
Graph dist(100009,vec(4,st));
int n,m,k;
set<pair<ll,Pair>>s;
vector<vector<Pair>>g(100009);
void dij(){
Pair p = s.begin()->second;
visited.insert(p);
ll now = p.first;
ll cou = p.second;
ll d = dist[now][cou];
for(auto next:g[now]){
if(dist[next.second][cou] > d + next.first){
s.insert({d + next.first,{next.second,cou}});
dist[next.second][cou] = d + next.first;
}
if(cou < 3 && dist[next.second][cou+1] > d){
s.insert({d,{next.second,cou+1}});
dist[next.second][cou+1] = d;
}
}
while(!s.empty() && visited.count(s.begin()->second)){
s.erase(s.begin());
}
if(!s.empty())dij();
}
int main(){
cin >> n >> m >> k;
vec c(m+1);
rep(i,1,m)cin >> c[i];
rep(i,1,m){
int u,v;
cin >> u >> v;
g[u].push_back({c[i],v});
g[v].push_back({c[i],u});
}
dist[1][0] = 0;
s.insert({0,{1,0}});
dij();
ll ans = st;
rep(i,0,k)ans = min(ans, dist[n][i]);
if(ans < st)cout << ans << endl;
else cout << -1 << endl;
//rep(i,1,n)cout << dist[i][0] << " ";
}