제출 #392480

#제출 시각아이디문제언어결과실행 시간메모리
392480paliloCommuter Pass (JOI18_commuter_pass)C++17
15 / 100
315 ms14468 KiB
#include <bits/stdc++.h>
using namespace std;

constexpr int64_t INF = 0x3f3f3f3f3f3f3f3f;

struct min_heap_elem {
    int64_t d;
    int u;
    min_heap_elem(int64_t d, int u) : d(d), u(u) {}
    bool operator<(const min_heap_elem& rhs) const {
        return d > rhs.d;
    }
};

struct max_heap_elem {
    int64_t d;
    int u;
    max_heap_elem(int64_t d, int u) : d(d), u(u) {}
    bool operator<(const max_heap_elem& rhs) const {
        return d < rhs.d;
    }
};

int main() {
    cin.tie(nullptr)->sync_with_stdio(false);
#ifdef home
    freopen("in", "r", stdin);
    freopen("out", "w", stdout);
#endif
    int n, m, s, t, m1, m2;
    cin >> n >> m >> s >> t >> m1 >> m2;
    --s, --t, --m1, --m2;

    vector<vector<pair<int, int>>> adj(n);
    for (int u, v, w; m--;) {
        cin >> u >> v >> w, --u, --v;
        adj[u].emplace_back(w, v);
        adj[v].emplace_back(w, u);
    }

    auto dijk = [&](int src) {
        vector<int64_t> dist(n, INF);

        priority_queue<min_heap_elem> pq;
        pq.emplace(dist[src] = 0, src);

        while (!pq.empty()) {
            const auto [d, u] = pq.top();
            pq.pop();

            if (d != dist[u]) continue;

            for (const auto& [w, v] : adj[u])
                if (dist[v] > d + w)
                    pq.emplace(dist[v] = d + w, v);
        }
        return dist;
    };

    auto dist = dijk(s);
    auto dist_from_u = dijk(m1), dist_from_v = dijk(m2);

    auto solve = [&](vector<int64_t>& dp1, vector<int64_t>&& dp2) {
        vector<bool> visited(n);
        visited[t] = true;

        priority_queue<max_heap_elem> pq;
        pq.emplace(dist[t], t);

        while (!pq.empty()) {
            const auto [d, v] = pq.top();
            pq.pop();

            for (const auto& [w, u] : adj[v])
                if (!visited[u] && d == dist[u] + w) {
                    visited[u] = true;
                    dp2[u] = min(dp2[u], dp2[v]);
                    pq.emplace(dist[u], u);
                }
        }

        int64_t ret = INT64_MAX;
        for (int i = 0; i < n; ++i)
            ret = min(ret, dp1[i] + dp2[i]);
        return ret;
    };

    cout << min(solve(dist_from_u, move(dist_from_v)),
                solve(dist_from_v, move(dist_from_u)));
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...