Submission #849470

#TimeUsernameProblemLanguageResultExecution timeMemory
849470vjudge1Commuter Pass (JOI18_commuter_pass)C++17
100 / 100
254 ms24116 KiB
#include <bits/stdc++.h>
using namespace std;

int32_t 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, int>>> adj(N);
        for (int i = 0; i < M; i++) {
                int u, v, w;
                cin >> u >> v >> w;
                u--, v--;
                adj[u].emplace_back(v, w);
                adj[v].emplace_back(u, w);
        }

        auto dijkstra = [&](vector<int64_t>& d, int source) {
                fill(d.begin(), d.end(), 1e18);
                d[source] = 0;
                priority_queue<pair<int64_t, int>> pq;
                pq.emplace(0, source);
                while (pq.size()) {
                        auto [du, u] = pq.top();
                        pq.pop();
                        if (d[u] != -du) continue;
                        for (auto [v, w] : adj[u]) {
                                if (d[v] > -du + w) {
                                        d[v] = -du + w;
                                        pq.emplace(-d[v], v);
                                }
                        }
                }
        };

        vector<int64_t> dS(N), dT(N), dU(N), dV(N);
        dijkstra(dS, S);
        dijkstra(dT, T);
        dijkstra(dU, U);
        dijkstra(dV, V);

        int64_t min_dist = dS[T];

        auto calc = [&](const vector<int64_t>& ds, const vector<int64_t>& dt, const vector<int64_t>& du, vector<int64_t>& best, int s) {
                fill(best.begin(), best.end(), 1e18);
                vector<int> topo;
                vector<int> vis(N, 0);
                function<void(int)> toposort = [&](int u) {
                        vis[u] = 1;
                        for (auto [v, w] : adj[u]) {
                                if (ds[u] + w == min_dist - dt[v] && vis[v] == 0) {
                                        toposort(v);
                                }
                        }
                        topo.emplace_back(u);
                };
                toposort(s);
                reverse(topo.begin(), topo.end());
                for (int i : topo) {
                        best[i] = min(best[i], du[i]);
                        for (auto [j, w] : adj[i]) {
                                if (ds[i] + w == min_dist - dt[j]) {
                                        best[j] = min(best[j], best[i]);
                                }
                        }
                }
        };

        vector<int64_t> dSU(N), dSV(N), dTU(N), dTV(N);
        calc(dS, dT, dU, dSU, S);
        calc(dS, dT, dV, dSV, S);
        calc(dT, dS, dU, dTU, T);
        calc(dT, dS, dV, dTV, T);

        int64_t res = 2e18;
        for (int i = 0; i < N; i++) {
                res = min(res, min(dSU[i] + dTV[i], dSV[i] + dTU[i]));
        }

        cout << min(res, dU[V]);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...