Submission #1283762

#TimeUsernameProblemLanguageResultExecution timeMemory
1283762yanbCommuter Pass (JOI18_commuter_pass)C++20
100 / 100
608 ms23052 KiB
#include <bits/stdc++.h>

#define int long long

using namespace std;

using pii = pair<int, int>;
using t3i = tuple<int, int, int>;

int n, m, S, T, U, V;
vector<vector<pii>> g;

vector<int> dst(int v) {
    priority_queue<pii, vector<pii>, greater<pii>> q;
    q.push({0, v});
    vector<int> d(n, 1e17);

    while (!q.empty()) {
        auto [dv, v] = q.top();
        q.pop();
        if (d[v] <= dv) continue;
        d[v] = dv;

        for (auto [u, c] : g[v]) {
            q.push({dv + c, u});
        }
    }

    return d;
}

signed main() {
    ios_base::sync_with_stdio(0); cin.tie(0);

    cin >> n >> m >> S >> T >> U >> V;
    S--; T--; U--; V--;

    g.resize(n);
    for (int i = 0; i < m; i++) {
        int x, y, c;
        cin >> x >> y >> c;
        x--; y--;
        g[x].push_back({y, c});
        g[y].push_back({x, c});
    }

    vector<int> dS = dst(S), dT = dst(T), dU = dst(U), dV = dst(V);
    
    vector<pii> dSi(n);
    for (int i = 0; i < n; i++) dSi[i] = {dS[i], i};
    sort(dSi.begin(), dSi.end());

    vector<int> dpU(n, 1e17), dpV(n, 1e17);
    int ans = dU[V];

    for (auto [_, v] : dSi) {
        if (dT[v] + dS[v] != dT[S]) continue;
        dpU[v] = min(dpU[v], dU[v]);
        dpV[v] = min(dpV[v], dV[v]);
        for (auto [u, c] : g[v]) {
            if (dS[u] + c == dS[v] && dT[u] == dT[v] + c) {
                dpU[v] = min(dpU[v], dpU[u]);
                dpV[v] = min(dpV[v], dpV[u]);
            }
        }
        ans = min({ans, dpU[v] + dV[v], dpV[v] + dU[v]});
    }

    cout << ans << "\n";
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...