結果
問題 | No.2387 Yokan Factory |
ユーザー |
|
提出日時 | 2023-07-25 13:04:34 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 861 ms / 5,000 ms |
コード長 | 3,565 bytes |
コンパイル時間 | 3,948 ms |
コンパイル使用メモリ | 265,384 KB |
最終ジャッジ日時 | 2025-02-15 18:57:36 |
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 35 |
ソースコード
#pragma region Macros#include <bits/stdc++.h>#include <atcoder/all>#if defined(LOCAL) || defined(_DEBUG)#include "debug.hpp"#else#define O(...)#define START()#define STOP()#define MEMORY()#endifusing namespace std;#define REP(i, n) for(int i=0, i##_len=(n); i<i##_len; ++i)#define REPR(i, n) for(int i=(n); i>=0; --i)#define FOR(i, n, m) for(int i=(m), i##_len=(n); i<i##_len; ++i)#define EACH(i, v) for(const auto& i : v)#define ALL(x) (x).begin(),(x).end()#define ALLR(x) (x).rbegin(),(x).rend()template<class T, class U>bool chmax(T &a, const U &b) { if (a<(T)b) { a=(T)b; return 1; } return 0; }template<class T, class U>bool chmin(T &a, const U &b) { if (b<(T)a) { a=(T)b; return 1; } return 0; }#define vec vector#define umap unordered_map#define uset unordered_setusing ll = long long;using ld = long double;using P = pair<ll, ll>;using Tup = tuple<ll, ll, ll>;using vl = vec<ll>;#define fi first#define se second#define el endlconstexpr ll INF = numeric_limits<ll>::max()/2-1;template<class T>istream &operator>>(istream &stream, vec<T>& o){REP(i, o.size())stream >> o[i];return stream;}#define I(T, ...) ;T __VA_ARGS__;__i(__VA_ARGS__);void __i() {}template<class T, class... Ts> void __i(T&& o, Ts&&... args){cin >> o;__i(forward<Ts>(args)...);}#pragma endregionvoid Main();int main(){std::cin.tie(nullptr);std::cout << std::fixed << std::setprecision(15);Main();MEMORY();return 0;}#pragma region graphstruct edge{ll from, to, cost;bool operator<(const edge& r) const{return cost<r.cost;}bool operator>(const edge& r) const{return cost>r.cost;}};struct graph{ll V;vector<vector<edge> > G;graph(ll n){init(n);}void init(ll n){V = n;G.resize(V);}// 無向グラフvoid add_edge(ll s, ll t, ll cost = 1){add_diedge(s, t, cost);add_diedge(t, s, cost);}// 有向グラフvoid add_diedge(ll s, ll t, ll cost = 1){if(s < 0 || t < 0 || s >= V || t >= V) return;G[s].push_back({s, t, cost});}auto pos2d(ll height, ll width){return [height, width](ll y, ll x){return(y < 0 || y >= height || x < 0 || x >= width)? -1: y*width + x;};}};#pragma endregion// O(|E|log|V|)vl dijkstra(const graph& g, ll s){vector<ll> d(g.V, INF);umap<ll, ll> ret;ret[s] = d[s] = 0;priority_queue<P,vector<P>, greater<P>> que;que.push({0, s});while(!que.empty()){auto [c, v] = que.top(); que.pop();if(d[v]<c) continue;for(auto e : g.G[v]){if(d[e.to]>d[v]+e.cost){ret[e.to] = d[e.to] = d[v]+e.cost;que.push({d[e.to],e.to});}}}return d;}// x∈[l, r] | f(x) = true となる最大のxを返すtemplate <class Func>ll binarySearch(ll l, ll r, Func f){while(l < r){const ll m = (l+r+1)/2;if(f(m)) l = m;else r = m-1;}return l;}void Main(){I(ll, n, m, x);vl u(m), v(m), a(m), b(m);REP(i, m) {cin >> u[i] >> v[i] >> a[i] >> b[i];u[i]--; v[i]--;}ll ans = binarySearch(-1, 1e9, [&](ll mid) {// グラフの構成graph g(n);REP(i, m) {if(mid <= b[i]) {g.add_edge(u[i], v[i], a[i]);}}auto d = dijkstra(g, 0);return d[n-1] <= x;});cout << ans << el;}