Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <vector>
- #include <algorithm>
- #include <iostream>
- #include <set>
- #define int long long
- using namespace std;
- struct edge {
- int to, w;
- edge(int to, int w) : to(to), w(w) {};
- };
- int n, m, s, f;
- vector<vector<edge>> g;
- vector<vector<int>> lim;
- vector<int> dist;
- const int INF = 1e9;
- const int TL = 24 * 60;
- const int VEHICLE = 3 * 1e6;
- bool djikstra(int limit) {
- dist.assign(n, INF);
- dist[s] = 0;
- set<pair<int, int>> q;
- for (int v = 0; v < n; ++v) {
- q.insert({dist[v], v});
- }
- while (!q.empty()) {
- int now = (*q.begin()).second;
- q.erase(q.begin());
- for (auto u : g[now]) {
- if (lim[now][u.to] >= limit && dist[u.to] > dist[now] + u.w) {
- q.erase({dist[u.to], u.to});
- dist[u.to] = dist[now] + u.w;
- q.insert({dist[u.to], u.to});
- }
- }
- }
- return dist[f] <= TL;
- }
- signed main() {
- // freopen("input.txt", "r", stdin);
- // freopen("output.txt", "w", stdout);
- cin >> n >> m;
- if (n == 1) {
- cout << 10 * (int) 1e6;
- return 0;
- }
- g.resize(n);
- lim.assign(n, vector<int>(n, INF));
- for (int _ = 0; _ < m; ++_) {
- int a, b, w_, l;
- cin >> a >> b >> w_ >> l;
- a--, b--;
- g[a].emplace_back(b, w_);
- g[b].emplace_back(a, w_);
- lim[a][b] = l;
- }
- s = 0, f = n - 1;
- int l = 0, r = INF;
- while (l + 1 < r) {
- m = (l + r) / 2;
- if (djikstra(VEHICLE + 100 * m)) {
- l = m;
- } else {
- r = m;
- }
- }
- cout << l;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement