Advertisement
Guest User

Untitled

a guest
Apr 21st, 2019
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.00 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. vector<vector<pair <int, int>>> g(200001);
  4. long long w[200001];
  5. long long c[200001];
  6. vector<long long> dist_s(200001, -1);
  7. vector<long long> dist_t(200001, -1);
  8. long long ans = 1e18;
  9. set<pair<long long, int>> q;
  10. int main() {
  11.     ios_base::sync_with_stdio(0);
  12.     cin.tie(nullptr);
  13.     int n, m, s, t;
  14.     long long a, b;
  15.     cin >> n >> m >> s >> t >> a >> b;
  16.     for (int i = 0; i < m; ++i) {
  17.         int x, y;
  18.         cin >> x >> y >> w[i] >> c[i];
  19.         g[x].push_back({y, i});
  20.         g[y].push_back({x, i});
  21.         if (w[i] < 0) {
  22.             ans = 0;
  23.         }
  24.     }
  25.     if (ans == 0) {
  26.         cout << 0;
  27.         return 0;
  28.     }
  29.     dist_s[s] = 0;
  30.     q.insert({0 * 1ll, s});
  31.     while (!q.empty()) {
  32.         int u = q.begin()->second;
  33.         q.erase(q.begin());
  34.         for (auto p : g[u]) {
  35.             int v = p.first;
  36.             int ind = p.second;
  37.             if (dist_s[v] == -1 || dist_s[v] > dist_s[u] + w[ind]) {
  38.                 q.erase({dist_s[v], v});
  39.                 dist_s[v] = dist_s[u] + w[ind];
  40.                 q.insert({dist_s[v], v});
  41.             }
  42.         }
  43.     }
  44.     dist_t[t] = 0;
  45.     q.insert({0, t});
  46.     while (!q.empty()) {
  47.         int u = q.begin()->second;
  48.         q.erase(q.begin());
  49.         for (auto p : g[u]) {
  50.             int v = p.first;
  51.             int ind = p.second;
  52.             if (dist_t[v] == -1 || dist_t[v] > dist_t[u] + w[ind]) {
  53.                 q.erase({dist_t[v], v});
  54.                 dist_t[v] = dist_t[u] + w[ind];
  55.                 q.insert({dist_t[v], v});
  56.             }
  57.         }
  58.     }
  59.     for (int u = 1; u <= n; ++u) {
  60.         for (auto p : g[u]) {
  61.             int v = p.first;
  62.             int ind = p.second;
  63.             ans = min(ans, c[ind] * (w[ind] + 1));
  64.             ans = min(ans, (dist_s[u] + dist_t[v] + w[ind] + a - b) * c[ind]);
  65.             ans = min(ans, (dist_s[v] + dist_t[u] + w[ind] + a - b) * c[ind]);
  66.         }
  67.     }
  68.     cout << max(ans, 0 * 1ll);
  69. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement