Submission #1032589

#TimeUsernameProblemLanguageResultExecution timeMemory
1032589VectorLiCommuter Pass (JOI18_commuter_pass)C++17
31 / 100
430 ms20848 KiB
#include <bits/stdc++.h>
#define long long long
#define y0 asdad13
#define y1 dsgfsf4we

using namespace std;

const int N = (int) 1E5;
const long B = numeric_limits<long>::max();

int n, m;
int x0, y0;
int x1, y1;
long d[4][N];
long c;
vector<pair<int, int>> e[N];

void Dijkstra0(int x, int i) {
    set<pair<long, int>> q;

    fill(d[i], d[i] + n, B);
    d[i][x] = 0;
    q.insert({0, x});

    while (not q.empty()) {
        int u = q.begin() -> second;
        q.erase(q.begin());
        for (auto [v, w] : e[u]) {
            if (d[i][v] > d[i][u] + w) {
                q.erase({d[i][v], v});
                d[i][v] = d[i][u] + w;
                q.insert({d[i][v], v});
            }
        }
    }
}

long f[N];
long d0[N];

void Dijkstra1(int x) {
    set<pair<long, int>> q;

    fill(d0, d0 + n, B);
    d0[x] = 0;
    f[x] = d[0][x];
    q.insert({0, x});
    c = min(c, f[x] + d[1][x]);

    assert(x0 != y1 || x1 != y0);
    while (not q.empty()) {
        int u = q.begin() -> second;
        q.erase(q.begin());
        for (auto [v, w] : e[u]) {
            if (d0[v] > d0[u] + w) {
                q.erase({d0[v], v});
                d0[v] = d0[u] + w;
                f[v] = min(f[u], d[0][v]);
                if (d[2][u] + w + d[3][v] == d[2][y0]) {
                    c = min(c, f[v] + d[1][v]);
                }
                q.insert({d0[v], v});
            } else if (d0[v] == d0[u] + w) {
                f[v] = min(f[v], f[u]);
                // if (d[2][v] + d[3][v] == d[2][y0]) {
                //     c = min(c, f[v] + d[1][v]);
                // }
            }
        }
    }

    for (int i = 0; i < n; i++) {
        // if (i == x) {
        //     continue;
        // }
        if (d[2][i] + d[3][i] == d[2][y0]) {
            c = min(c, d[1][i] + f[i]);
        }
    }

    // cout << d[0][5 - 1] << "\n";
    // for (int i = 0; i < n; i++) {
    //     cout << i + 1 << " " << f[i] << "\n";
    // }
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    cin >> n >> m;
    cin >> x0 >> y0;
    x0 = x0 - 1, y0 = y0 - 1;
    cin >> x1 >> y1;
    x1 = x1 - 1, y1 = y1 - 1;
    for (int i = 0; i < m; i++) {
        int u, v, w;
        cin >> u >> v >> w;
        u = u - 1, v = v - 1;
        e[u].push_back({v, w});
        e[v].push_back({u, w});
    }

    Dijkstra0(x1, 0);
    Dijkstra0(y1, 1);
    Dijkstra0(x0, 2);
    Dijkstra0(y0, 3);
    c = d[0][y1];
    Dijkstra1(x0);
    Dijkstra1(y0);
    cout << c << "\n";

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...