Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- vector<vector<pair <int, int>>> g(200001);
- long long w[200001];
- long long c[200001];
- vector<long long> dist_s(200001, -1);
- vector<long long> dist_t(200001, -1);
- long long ans = 1e18;
- set<pair<long long, int>> q;
- int main() {
- ios_base::sync_with_stdio(0);
- cin.tie(nullptr);
- int n, m, s, t;
- long long a, b;
- cin >> n >> m >> s >> t >> a >> b;
- for (int i = 0; i < m; ++i) {
- int x, y;
- cin >> x >> y >> w[i] >> c[i];
- g[x].push_back({y, i});
- g[y].push_back({x, i});
- if (w[i] < 0) {
- ans = 0;
- }
- }
- if (ans == 0) {
- cout << 0;
- return 0;
- }
- dist_s[s] = 0;
- q.insert({0 * 1ll, s});
- while (!q.empty()) {
- int u = q.begin()->second;
- q.erase(q.begin());
- for (auto p : g[u]) {
- int v = p.first;
- int ind = p.second;
- if (dist_s[v] == -1 || dist_s[v] > dist_s[u] + w[ind]) {
- q.erase({dist_s[v], v});
- dist_s[v] = dist_s[u] + w[ind];
- q.insert({dist_s[v], v});
- }
- }
- }
- dist_t[t] = 0;
- q.insert({0, t});
- while (!q.empty()) {
- int u = q.begin()->second;
- q.erase(q.begin());
- for (auto p : g[u]) {
- int v = p.first;
- int ind = p.second;
- if (dist_t[v] == -1 || dist_t[v] > dist_t[u] + w[ind]) {
- q.erase({dist_t[v], v});
- dist_t[v] = dist_t[u] + w[ind];
- q.insert({dist_t[v], v});
- }
- }
- }
- for (int u = 1; u <= n; ++u) {
- for (auto p : g[u]) {
- int v = p.first;
- int ind = p.second;
- ans = min(ans, c[ind] * (w[ind] + 1));
- ans = min(ans, (dist_s[u] + dist_t[v] + w[ind] + a - b) * c[ind]);
- ans = min(ans, (dist_s[v] + dist_t[u] + w[ind] + a - b) * c[ind]);
- }
- }
- cout << max(ans, 0 * 1ll);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement