제출 #1273380

#제출 시각아이디문제언어결과실행 시간메모리
1273380ericl23302Commuter Pass (JOI18_commuter_pass)C++20
100 / 100
271 ms23828 KiB
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

const ll INF = 1e18;

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

    int n, m, s, t, u, v;
    cin >> n >> m >> s >> t >> u >> v;
    --s;
    --t;
    --u;
    --v;
    vector<vector<pair<int, ll>>> adjacency(n);
    for (int i = 0; i < m; ++i) {
        int a, b;
        ll c;
        cin >> a >> b >> c;
        --a;
        --b;
        adjacency[a].emplace_back(b, c);
        adjacency[b].emplace_back(a, c);
    }

    auto dijkstra1 = [&](int start, vector<ll> &dist) {
        dist.assign(n, INF);
        priority_queue<pair<ll, int>> pq;
        pq.emplace(0, start);
        dist[start] = 0;
        while (!pq.empty()) {
            auto [curDist, cur] = pq.top();
            pq.pop();
            curDist = -curDist;
            if (curDist != dist[cur]) continue;
            for (auto &[adj, len] : adjacency[cur]) {
                if (dist[adj] > curDist + len) {
                    dist[adj] = curDist + len;
                    pq.emplace(-curDist - len, adj);
                }
            }
        }
    };

    vector<ll> distU(n), distV(n);
    dijkstra1(u, distU);
    dijkstra1(v, distV);
    ll ans = distU[v];

    auto dijkstra2 = [&](int start, int end) {
        vector<ll> dp0(n, INF), dp1(n, INF), dist(n, INF);
        vector<bool> visited(n, false);
        priority_queue<pair<ll, pair<int, int>>> pq;
        dist[start] = 0;
        pq.push({0, {start, 0}});
        while (!pq.empty()) {
            auto [curDist, curPar] = pq.top();
            pq.pop();
            if (!visited[curPar.first]) {
                visited[curPar.first] = true;
                dist[curPar.first] = -curDist;
                dp0[curPar.first] =
                    min(distU[curPar.first], dp0[curPar.second]);
                dp1[curPar.first] =
                    min(distV[curPar.first], dp1[curPar.second]);
                for (auto &[adj, len] : adjacency[curPar.first])
                    pq.push({curDist - len, {adj, curPar.first}});
            } else if (-curDist == dist[curPar.first]) {
                if (min(distU[curPar.first], dp0[curPar.second]) +
                        min(distV[curPar.first], dp1[curPar.second]) <
                    dp0[curPar.first] + dp1[curPar.first]) {
                    dp0[curPar.first] =
                        min(distU[curPar.first], dp0[curPar.second]);
                    dp1[curPar.first] =
                        min(distV[curPar.first], dp1[curPar.second]);
                }
            }
        }

        ans = min(ans, dp0[end] + dp1[end]);
    };

    dijkstra2(s, t);
    dijkstra2(t, s);

    cout << ans << '\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...