Submission #1181683

#TimeUsernameProblemLanguageResultExecution timeMemory
1181683PakinDioxideCommuter Pass (JOI18_commuter_pass)C++17
100 / 100
177 ms23696 KiB
/*
    author  : PakinDioxide
    created : 07/04/2025 18:11
    task    : JOI18_commuter_pass
*/
#include <bits/stdc++.h>
#define ll long long

using namespace std;

int main() {
    ios::sync_with_stdio(0), cin.tie(0);
    int n, m, s, t, x, y;
    cin >> n >> m >> s >> t >> x >> y;
    vector <pair <int, ll>> adj[n+1];
    for (int i = 0; i < m; i++) {
        int u, v; ll w;
        cin >> u >> v >> w;
        adj[u].emplace_back(v, w);
        adj[v].emplace_back(u, w);
    }
    ll disx[n+1], disy[n+1];
    for (int i = 1; i <= n; i++) disx[i] = disy[i] = LLONG_MAX;
    priority_queue <pair <ll, int>> q;
    disx[x] = disy[y] = 0;
    q.emplace(0, x);
    while (!q.empty()) {
        auto [w, u] = q.top();
        q.pop();
        w=-w;
        if (disx[u] != w) continue;
        for (auto [v, ww] : adj[u]) if (disx[v] > ww+w) q.emplace(-(disx[v] = ww+w), v);
    }
    q.emplace(0, y);
    while (!q.empty()) {
        auto [w, u] = q.top();
        q.pop();
        w=-w;
        if (disy[u] != w) continue;
        for (auto [v, ww] : adj[u]) if (disy[v] > ww+w) q.emplace(-(disy[v] = ww+w), v);
    }
    priority_queue <tuple <ll, ll, ll, ll, int>> Q; // dis, minx+miny, minx, miny, u
    pair <ll, ll> dis[n+1];
    for (int i = 1; i <= n; i++) dis[i] = make_pair(LLONG_MAX, LLONG_MAX);
    dis[s] = make_pair(0, disx[s] + disy[s]);
    Q.emplace(0, -(disx[s] + disy[s]), -disx[s], -disy[s], s);
    while (!Q.empty()) {
        auto [w, sum, minx, miny, u] = Q.top();
        Q.pop();
        w=-w, sum=-sum, minx=-minx, miny=-miny;
        if (make_pair(w, sum) != dis[u]) continue;
        for (auto [v, ww] : adj[u]) {
            ll nw = w+ww, nx = min(minx, disx[v]), ny = min(miny, disy[v]), ns = nx+ny;
            if (dis[v].first > nw) Q.emplace(-(dis[v].first = nw), -(dis[v].second = ns), -nx, -ny, v);
            else if (dis[v].first == nw && dis[v].second > ns) Q.emplace(-(dis[v].first = nw), -(dis[v].second = ns), -nx, -ny, v);
        }
    }
    cout << min(dis[t].second, disx[y]) << '\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...