結果
問題 | 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] << " "; }