結果
問題 | No.2387 Yokan Factory |
ユーザー | erbowl |
提出日時 | 2023-07-21 21:34:03 |
言語 | C++17(gcc12) (gcc 12.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 394 ms / 5,000 ms |
コード長 | 1,180 bytes |
コンパイル時間 | 2,401 ms |
コンパイル使用メモリ | 214,236 KB |
実行使用メモリ | 13,032 KB |
最終ジャッジ日時 | 2024-09-21 22:53:30 |
合計ジャッジ時間 | 7,022 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 35 |
ソースコード
typedef long long ll; typedef long double ld; #include <bits/stdc++.h> using namespace std; #define int long long signed main(){ ll n,m,x; std::cin >> n>>m>>x; vector<vector<tuple<ll,ll,ll>>> edges(n); for (int i = 0; i < m; i++) { ll u,v,a,b; std::cin >> u>>v>>a>>b; u--;v--; edges[u].push_back({v,a,b}); edges[v].push_back({u,a,b}); } ll l = 0; ll r = 1e15; using P = pair<ll,ll>; while(r-l>1){ ll m = (r+l)/2; vector<ll> dis(n,1e18); dis[0] = 0; priority_queue<P,vector<P>,greater<P>> pq; pq.push({0,0}); while(!pq.empty()){ auto [d, p] = pq.top();pq.pop(); if(dis[p]<d)continue; for (auto e : edges[p]) { auto [v,a,b] = e; if(dis[v]>d+a&&b>=m){ dis[v] = d+a; pq.push({dis[v], v}); } } } if(dis[n-1]<=x){ l = m; }else{ r = m; } } if(l==0){ std::cout << -1 << std::endl; }else{ std::cout << l << std::endl; } }