Submission #1307427

#TimeUsernameProblemLanguageResultExecution timeMemory
1307427fauntleroyCommuter Pass (JOI18_commuter_pass)C++20
100 / 100
272 ms19864 KiB
#include <iostream>
#include <cstdio>
#include <vector>
#include <array>
#include <string>
#include <algorithm>
#include <numeric>
#include <map>
#include <unordered_map>
#include <set>
#include <unordered_set>
#include <queue>
#include <cmath>
#include <climits>
#include <iomanip>
#include <limits>
#include <tuple>
#include <stack>
#include <bitset>
#include <cstring>
#include <sstream>
#include <functional>
#include <random>
using namespace std;

using ll = long long;

ll inf = 4e18;

vector<vector<pair<int, ll>>> g;

vector<ll> dijkstra(int n, int src) {
    vector<ll> dist(n, inf);
    dist[src] = 0;
    priority_queue<pair<ll, int>, vector<pair<ll, int>>, greater<pair<ll, int>>> pq;
    pq.push({ 0,src });
    while (!pq.empty()) {
        auto [d, u] = pq.top();
        pq.pop();
        if (d > dist[u]) {
            continue;
        }
        for (auto& [v, w] : g[u]) {
            ll nd = d + w;
            if (nd < dist[v]) {
                dist[v] = nd;
                pq.emplace(nd, v);
            }
        }
    }
    return dist;
}

void solve() {
    int n, m, s, t, u, v;
    cin >> n >> m >> s >> t >> u >> v;
    s--, t--, u--, v--;
    g.assign(n, {});
    for (int i = 0; i < m; ++i) {
        int a, b;
        ll w;
        cin >> a >> b >> w;
        --a, --b;
        g[a].push_back({ b, w });
        g[b].push_back({ a, w });
    }
    vector<ll> ds = dijkstra(n, s);
    vector<ll> dt = dijkstra(n, t);
    vector<ll> du = dijkstra(n, u);
    vector<ll> dv = dijkstra(n, v);
    
    ll d = ds[t];

    vector<bool> mark(n, 0);
    for (int i = 0; i < n; ++i) {
        if (ds[i] + dt[i] == d) {
            mark[i] = true;
        }
    }

    vector<int> ord(n);
    iota(ord.begin(), ord.end(), 0);
    sort(ord.begin(), ord.end(), [&](int a, int b) { return ds[a] < ds[b]; });

    vector<ll> dp1u(n, inf), dp1v(n, inf);
    for (int i = 0; i < n; ++i) {
        if (mark[i]) {
            dp1u[i] = du[i];
            dp1v[i] = dv[i];
        }
    }

    for (auto& a : ord) {
        if (!mark[a]) {
            continue;
        }
        for (auto& e : g[a]) {
            int b = e.first;
            ll w = e.second;
            if (!mark[b]) {
                continue;
            }
            if (ds[a] + w + dt[b] == d) {
                dp1u[b] = min(dp1u[b], dp1u[a]);
                dp1v[b] = min(dp1v[b], dp1v[a]);
            }
        }
    }

    vector<ll> dp2u(n, inf), dp2v(n, inf);
    for (int i = 0; i < n; ++i) {
        if (mark[i]) {
            dp2u[i] = du[i];
            dp2v[i] = dv[i];
        }
    }
    for (int i = n - 1; i >= 0; --i) {
        int a = ord[i];
        if (!mark[a]) {
            continue;
        }
        for (auto& e : g[a]) {
            int b = e.first;
            ll w = e.second;
            if (!mark[b]) {
                continue;
            }
            if (ds[a] + w + dt[b] == d) {
                dp2u[a] = min(dp2u[a], dp2u[b]);
                dp2v[a] = min(dp2v[a], dp2v[b]);
            }
        }
    }
    ll ans = du[v];
    for (int i = 0; i < n; ++i) {
        if (dp1u[i] < inf && dp2v[i] < inf) {
            ans = min(ans, dp1u[i] + dp2v[i]);
        }
        if (dp1v[i] < inf && dp2u[i] < inf) {
            ans = min(ans, dp1v[i] + dp2u[i]);
        }
    }
    cout << ans << '\n';
}

signed main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    solve();
    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...